<?php
require_once 'TaoBaoRequest.class.php';
require_once 'TaoBaoUser.class.php';
require_once 'TaoBaoTrade.class.php';
require_once 'TaoBaoLogistics.class.php';
require_once 'TaoBaoItem.class.php';
require_once 'TaoBaoProduct.class.php';
require_once 'TaoBaoCatProp.class.php';
require_once 'TaoBaoTradeRate.class.php';
require_once 'TaoBaoShop.class.php';
require_once 'TaoBaoIncrement.class.php';

require_once 'TaoBaoWangWang.class.php';
require_once 'TaoBaoWarehouse.class.php';
require_once 'TaoBaoShouFei.class.php';
require_once 'TaoBaoFenXiao.class.php';
require_once 'TaoBaoKe.class.php';
/**
 *TaoBao接口运行时发生错误时，抛出此异常. 
 */
class TaoBaoRuntimeExecption extends Exception{
	function __construct($errorCode,$errorMessage){
		$errorCode=intval($errorCode);
		if($errorCode>0) 
		   $errorMessage="淘宝运行失败[{$errorCode}]：".self::get_taobao_error_msg($errorCode).";\n".$errorMessage;
		parent::__construct($errorMessage,$errorCode);
	}
	static function get_taobao_error_msg($errorCode){
		if($errorCode<=0) return;
		include_once 'TaoBaoErrorMsg.inc.php';
		$arr=&get_taobao_error_msg_array();
		return $arr[strval($errorCode)];
	}
}

/**
 * TaoBao接口运行时.
 */
class TaoBaoRuntime {
	/**
	 * @var TaoBaoRequest $request 用于访问TaoBao接口.
	 */
	var $request;
	/**
	 * @var integer $maxTryCount 调用可重调用数据不变接口函数失败最大重试次数，默认2次
	 */
	var $maxTryCount=2;
	/**
	 * @var integer $minTrySpanMicroseconds 调用可重调用数据不变接口函数失败最小重试时间间隔，毫秒数，默认300毫秒。
	 */
	var $minTrySpanMicroseconds=300;
	/**
	 * @var integer $maxTrySpanMicroseconds 调用可重调用数据不变接口函数失败最大重试时间间隔，毫秒数，默认500毫秒。
	 */
	var $maxTrySpanMicroseconds=500;
	
	/**
	 * 创建TaoBao接口API.
	 * @param array $taobao_token 操作用户的TabBao 令牌.
	 * <br/>必须包含以下参数：<br/>
	 * string app_key API应用的标志符.<br/>
	 * string app_secret API appSecret，用于用户鉴权.<br/>
	 * string app_session  淘宝会话
	 */
	function __construct($taobao_token) {
		if (! is_array ( $taobao_token ))
			throw new TaoBaoRuntimeExecption ( - 1, 'TaoBaoRuntime创建失败：参数类型错误' );
		
		$app_key = $taobao_token ['app_key'];
		$app_secret = $taobao_token ['app_secret'];
		if (! $app_key || ! $app_secret)
			throw new TaoBaoRuntimeExecption ( - 1, 'TaoBaoRuntime创建失败：参数错误' );
		if(array_key_exists('app_session',$taobao_token))
		   $app_session = $taobao_token ['app_session'];
		else $app_session=NULL;
		$this->request = new TaoBaoRequest ();
		$this->request->app_token = array ('app_key' => $app_key, 
				'app_secret' => $app_secret, 'app_session' => $app_session );
		 
	}
	function __destruct() {
	   $this->request=NULL;
	}
	/**
	 * 将数组 $params 的值导入到对象 $obj 中，主要用于本类函数的参数对象中，如TradesParam $tradesparam
	 * <br/>此函数仅用于简单对象，即不包含其它对象的复杂对象。仅导入数组存在的同名var
	 * @param array $params  源数组
	 * @param mixed $obj 目标对象
	 */
	static function put_object_vars(array &$params,$obj){
		if (count ( $params ) == 0 || ! is_object ( $obj ))	return;
		foreach ( $params as $key => $val )
		  if (isset($val) && property_exists( $obj,$key ))
		     $obj->$key = $val; 
	}
	
	function setRunInSandBox($isRunInSandBox){
		$this->request->isRunInSandBox=$isRunInSandBox; 
	}
	
	/**
	 * 搜索当前会话用户作为卖家已卖出的交易数据，taobao method: taobao.trades.sold.get
	 * <br/>返回数据结果为创建订单时间的倒序
	 * @param TradesResult $tradesresult 传入填充要交易数据
	 * @param TradesParam $tradesparam 搜索参数
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段。目前支持有：
	 * <br/>1、Trade中可以指定返回的fields：seller_nick, buyer_nick, title, type, created, 
	 * tid, seller_rate, buyer_rate, status, payment, discount_fee, adjust_fee, post_fee,
	 *  total_fee, pay_time, end_time, modified, consign_time, buyer_obtain_point_fee,
	 *  point_fee, real_point_fee, received_payment, commission_fee, pic_path, iid, num, 
	 *  price, cod_fee, cod_status, shipping_type, receiver_name, receiver_state, receiver_city, 
	 *  receiver_district, receiver_address, receiver_zip, receiver_mobile, 
	 *  receiver_phone 
	 *  <br/>2、Order中可以指定返回fields：orders.title, orders.pic_path, orders.price, orders.num, 
	 *  orders.iid, orders.sku_id, orders.refund_status, orders.status, orders.oid, 
	 *  orders.total_fee, orders.payment, orders.discount_fee, orders.adjust_fee, 
	 *  orders.sku_properties_name, orders.item_meal_name, orders.buyer_rate, 
	 *  orders.seller_rate, orders.outer_iid, orders.outer_sku_id, orders.refund_id, orders.seller_type
	 *  <br/>3、fields：orders（返回Order的所有内容）
	 *  @return TradesResult 返回已经填充的交易数据
	 */
	function readTradesSold(TradesResult $tradesresult,TradesParam $tradesparam,$fields=NULL) {
		if(! $tradesparam || ! $tradesresult)
		  throw  new TaoBaoRuntimeExecption(-1,'readTradesSold运行失败：参数错误');
	
		$paramarr=get_object_vars($tradesparam);
		if(! $fields){
			$fields=&$this->_getFields(new Trade()) ;
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.trades.sold.get',$paramarr);
		return $this->__firefillProperty($tradesresult,$resultarr,TradesResult::$_DataLayerout['varclass']);
	}
	/**
	 * 搜索当前会话用户作为卖家已卖出的增量交易数据，taobao method: taobao.trades.sold.increment.get
	 * <br/>只能查询时间跨度为一天的增量交易记录 
	 * <br/>返回数据结果为创建订单时间的倒序
	 * @param TradesResult $tradesresult 传入要填充的增量交易数据
	 * @param TradesParam $tradesparam 搜索参数
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see readTradesSold.
	 * @return TradesResult 返回已经填充的增量交易数据
	 */
	function readTradesSoldIncrement(TradesResult $tradesresult,TradesIncrementParam $tradesparam,$fields=NULL) {
		if(! $tradesparam || ! $tradesresult)
		  throw  new TaoBaoRuntimeExecption(-1,'readTradesSoldIncrement运行失败：参数错误');
	
		$paramarr=get_object_vars($tradesparam);
		if(! $fields) $fields=&$this->_getFields(new Trade());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.trades.sold.increment.get',$paramarr);
		return $this->__firefillProperty($tradesresult,$resultarr,TradesResult::$_DataLayerout['varclass']);
	}	
	
	/**
	 * 获取单笔交易的部分信息(性能高)，taobao method: taobao.trade.get
	 * <br/>获取到的详细信息中不包含姓名，邮件，电话或手机，和支付宝账号信息
	 * <br/>获取到的Order中的payment字段在单笔子订单时包含物流费用，多笔子订单时不包含物流费用
	 * <br/>taobao.trade.get取到单笔交易的详细信息中无法取到如:email，姓名，电话或手机，和支付宝ID? 
	 * <br/>B商家通过taobao.trade.fullinfo.get这个API获取交易的收货人信息,C卖家无法获取收货人信息,
	 * 建议在淘宝店铺中从已卖出的宝贝批量导出订单获得收货人姓名等 。
	 * @param Trade $trade 搜索到的交易信息，返回的Trade和Order中包含的具体信息为入参fields请求的字段信息
	 * @param string $tid 交易编号 
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see readTradesSold.
	 * @return Trade 返回搜索到的交易信息
	 */
	function readTrade(Trade $trade,$tid,$fields=NULL) {
		if(! $trade || ! $tid)
		 throw  new TaoBaoRuntimeExecption(-1,'readTrade运行失败：参数错误');
	
		$paramarr=array('tid'=>$tid);
		if(! $fields) $fields=&$this->_getFields($trade);
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.trade.get',$paramarr);
		return $this->__firefillProperty($trade,$resultarr,Trade::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取单笔交易的详细信息，taobao method: taobao.trade.fullinfo.get
	 * <br/>只有在交易成功的状态下才能取到交易佣金，其它状态下取到的都是零或空值
	 * <br/>返回参数中的trade_memo和is_3d为专用字段，一般情况下查询不到
	 * <br/>只有单笔订单的情况下Trade数据结构中才包含商品相关的信息 
	 * <br/>获取到的Order中的payment字段在单笔子订单时包含物流费用，多笔子订单时不包含物流费用
	 * <br/>怎样取买家的信息?用taobao.trade.fullinfo.get查询订单详细信息。会带有买家的信息。
	 * <br/>订单中取不到outer_iid怎么办? 订单中如果取不到outer_iid但一定会取到iid，用iid去查询商品取到outer_iid。
	 * @param Trade $trade 搜索到的交易详细信息，返回的Trade和Order中包含的具体信息为入参fields请求的字段信息
	 * @param string $tid 交易编号 
	 * @param string $fields 查询字段。如果为空，自动传入Trade的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see readTradesSold.
	 * @return Trade 返回搜索到的交易详细信息
	 */
	function readTradeFullinfo(Trade $trade,$tid,$fields=NULL) {
		if(! $trade || ! $tid)
		  throw  new TaoBaoRuntimeExecption(-1,'readTradeFullinfo运行失败：参数错误');
	
		$paramarr=array('tid'=>$tid);
		if(! $fields) $fields=&$this->_getFields($trade);
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.trade.fullinfo.get',$paramarr);
		return $this->__firefillProperty($trade,$resultarr,Trade::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取交易确认收货费用，taobao method: taobao.trade.confirmfee.get
	 * @param TaobaoTradeConfirmFee $result 交易确认收货费用
	 * @param string $tid 交易编号，或子订单编号
	 * @param string $is_detail 是否是子订单。可选值:IS_FATHER(父订单),IS_CHILD(子订单) 
	 * @return TaobaoTradeConfirmFee 返回获取到的交易确认收货费用
	 */
	function readTradeConfirmfee(TaobaoTradeConfirmFee $result,$tid,$is_detail='IS_FATHER') {
		if(! $result || ! $tid)
		  throw  new TaoBaoRuntimeExecption(-1,'readTradeConfirmfee运行失败：参数错误');
	
		$paramarr=array('tid'=>$tid,'is_detail'=>$is_detail);
		//if(! $fields) $fields=&$this->_getFields($result);
		//$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.trade.confirmfee.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr);
	}
	/**
	 * 交易快照查询，taobao method: taobao.trade.snapshot.get
	 * <br/>取到交易的快照信息,共nbs调用
	 * @param Trade $result  搜索到的交易信息，
	 * 只包含Trade中的tid和snapshot、子订单Order中的oid和snapshot
	 * @param integer $tid    交易编号 
	 * @param string $fields 需要返回的字段列表。现只支持："snapshot"字段
	 * @return Trade 返回搜索到的交易信息
	 */
	function readTradeSnapshot(Trade $result,$tid,$fields=NULL) {
		if(! $result || ! $tid)
		 throw  new TaoBaoRuntimeExecption(-1,'readTradeSnapshot运行失败：参数错误');
	
		$paramarr=array('tid'=>$tid);
		$paramarr['fields']='snapshot';
		$resultarr = &$this->__fireRequest('taobao.trade.snapshot.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,Trade::$_DataLayerout['varclass']);
	}			
	/**
	 * 卖家关闭一笔交易，taobao method: taobao.trade.close
	 * <br/>只能关闭非关闭状态下的交易，其它情况下会报错
	 * <br/>关闭一笔交易（当前会话用户作为卖家达成的交易记录）
	 * @param integer $tid 交易编号 
	 * @param string $close_reason 交易关闭原因。最小长度: 6个字节
	 * @return string 关闭交易时间。格式:yyyy-MM-dd HH:mm:ss
	 */
	function writeTradeClose($tid,$close_reason) {
		if(! $close_reason || ! $tid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeTradeClose运行失败：参数错误');
	    if(strlen($close_reason)<6)
	      throw  new TaoBaoRuntimeExecption(-1,'writeTradeClose运行失败： 交易关闭原因 (close_reason)必须大于6个字节');
	    
		$paramarr=array('tid'=>$tid,'close_reason'=>$close_reason);
		$resultarr = &$this->__fireRequest('taobao.trade.close',$paramarr);
		$result=new stdClass();
		$this->__firefillProperty($result,$resultarr);
		if($result->tid != $tid) throw
		  new TaoBaoRuntimeExecption(-2,'writeTradeClose运行失败：运行结果tid不对');
		return $result->modified;
	}
	/**
	 * 对一笔交易添加备注，taobao method: taobao.trade.memo.add
	 * <br/>此接口不可重调用，建议调用@see writeTradeMemoUpdate
	 * <br/>需要商家或以上权限才可调用此接口
	 * <br/>不能重复调用此接口添加备注，需要更新备注请用taobao.trade.memo.update
	 * @param integer $tid 交易编号 
	 * @param string $memo  交易备注。最大长度: 1000个字节，如果>1000，将截断为1000字节
	 * @return string 备注添加时间。格式:yyyy-MM-dd HH:mm:ss 
	 */
	function writeTradeMemoAdd($tid,$memo) {
		if(! $memo || ! $tid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeTradeMemoAdd运行失败：参数错误');
	    if(strlen($memo)>1000)  $memo=substr($memo,0,1000); 
	    
		$paramarr=array('tid'=>$tid,'memo'=>$memo);
		$resultarr = &$this->__fireRequest('taobao.trade.memo.add',$paramarr,false);
		$result=new stdClass();
		$this->__firefillProperty($result,$resultarr);
		if($result->tid != $tid)
		  throw  new TaoBaoRuntimeExecption(-2,'writeTradeMemoAdd运行失败：运行结果tid不对');
		return $result->created;
	}			
	/**
	 * 修改一笔交易备注，taobao method: taobao.trade.memo.update
	 * <br/>需要商家或以上权限才可调用此接口
	 * <br/>可重复调用本接口更新交易备注
	 * <br/>本接口同时具有添加备注的功能
	 * @param integer $tid 交易编号 
	 * @param string $memo  交易备注。最大长度: 1000个字节，如果>1000，将截断为1000字节
	 * @return string 备注添加时间。格式:yyyy-MM-dd HH:mm:ss 
	 */
	function writeTradeMemoUpdate($tid,$memo) {
		if(! $memo || ! $tid)  throw
		  new TaoBaoRuntimeExecption(-1,'writeTradeMemoUpdate运行失败：参数错误');
		if(strlen($memo)>1000)  $memo=substr($memo,0,1000); 
	    
		$paramarr=array('tid'=>$tid,'memo'=>$memo);
		$resultarr = &$this->__fireRequest('taobao.trade.memo.update',$paramarr);
		$result=new stdClass();
		$this->__firefillProperty($result,$resultarr);
		if($result->tid != $tid)
		  throw  new TaoBaoRuntimeExecption(-2,'writeTradeMemoUpdate运行失败：运行结果tid不对');
		return $result->modified;
	}	
	/**
	 * 更新交易订单的销售属性，taobao method: taobao.trade.ordersku.update
	 * @param number $oid  子订单编号（对于单笔订单的交易可以传交易编号）。
	 * @param number $sku_id  销售属性编号，可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @param string $sku_props 销售属性组合串，格式：p1:v1;p2:v2，如：1627207:28329;20509:28314。
	 * 可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @return Trade 只返回oid和modified
	 */
	function writeTradeOrderskuUpdate($oid,$sku_id,$sku_props) {
		if(! $sku_id || ! $oid ||!$sku_props)  throw
		  new TaoBaoRuntimeExecption(-1,'writeTradeOrderskuUpdate运行失败：参数错误');
	     
		$paramarr=array('oid'=>$oid,'sku_id'=>$sku_id,'sku_props'=>$sku_props);
		$resultarr = &$this->__fireRequest('taobao.trade.ordersku.update',$paramarr);
		$result=new Trade();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 更改交易的收货地址，taobao method: taobao.trade.shippingaddress.update
	 * @param number $tid  子订单编号（对于单笔订单的交易可以传交易编号）。
	 * @param number $sku_id  销售属性编号，可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @param string $sku_props 销售属性组合串，格式：p1:v1;p2:v2，如：1627207:28329;20509:28314。
	 * 可以通过taobao.item.skus.get获取订单对应的商品的所有销售属性。
	 * @return Trade 返回tid和modified
	 */
	function writeTradeShippingaddressUpdate($tid,TaobaoTradeReceiver $receiver) {
		if(! $tid || ! $receiver)  throw
		  new TaoBaoRuntimeExecption(-1,'writeTradeShippingaddressUpdate运行失败：参数错误');
	     
		$paramarr=get_object_vars($receiver);
		$paramarr['tid']=$tid;
		$resultarr = &$this->__fireRequest('taobao.trade.shippingaddress.update',$paramarr);
		$result=new Trade();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 单笔退款详情，taobao method: taobao.refund.get
	 * @param TaobaoRefund $result 搜索到的交易详细信息
	 * @param integer $refund_id 交易编号 
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoRefund的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see TaobaoRefund.
	 * @return TaobaoRefund 返回单笔退款详情 $result
	 */
	function readRefund(TaobaoRefund $result,$refund_id,$fields=NULL) {
		if(! $result || ! $refund_id)
		  throw  new TaoBaoRuntimeExecption(-1,'readRefund运行失败：参数错误');
	
		$paramarr=array('refund_id'=>$refund_id);
		if(! $fields) $fields=&$this->_getFields($result);
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.refund.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoRefund::$_DataLayerout['varclass']);
	}
	/**
	 * 创建退款留言/凭证，taobao method: taobao.refund.message.add
	 * @param  integer $fund_id 退款编号
	 * @param  string  $content 留言内容。最大长度: 400个字节
	 * @param  string  $picpath 图片（凭证）。类型: JPG,GIF,PNG;最大为: 500K
	 * @return array   返回结果，数组结构如下 <br/>id：留言凭证编号；
	 * <br/>created：记录创建时间。格式:yyyy-MM-dd HH:mm:ss
	 */
	function writeRefundMessageAdd($fund_id,$content,$picpath=NULL){
		if(!$fund_id || !$content )
		  throw  new TaoBaoRuntimeExecption(-1,'writeRefundMessageAdd运行失败：参数错误');
		if(!file_exists($picpath))
		  throw  new TaoBaoRuntimeExecption(-1,'writeRefundMessageAdd运行失败：找不到图片文件'.$picpath);
		
		$request=clone $this->request;
		$request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['image']=$picpath;
		$paramarr=array('fund_id'=>$fund_id,'content'=>$content);
		$resultarr=&$this->__fireRequest('taobao.refund.message.add',$paramarr,true,$request);
		$request=NULL;
		
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
		return get_object_vars($list);		
	}	
	/**
	 * 退款留言/凭证列表查询，taobao method: taobao.refund.messages.get
	 * @param TaobaoRefundMessageList $result 搜索到的交易详细信息
	 * @param integer $refund_id 交易编号 
	 * @param integer $page_no 页码。取值范围:大于零的整数; 默认值:1
	 * @param integer $page_size 每页条数。取值范围:大于零的整数; 默认值:40;最大值:200
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoRefundMessage的所有字段
	 * <br/>需要返回的字段，目前支持字段见@see TaobaoRefundMessage.
	 * @return TaobaoRefundMessageList 返回单笔退款详情 $result
	 */
	function readRefundMessages(TaobaoRefundMessageList $result,$refund_id,$page_no=1,$page_size=40,$fields=NULL) {
		if(! $result || ! $refund_id || $page_no<1 || $page_size<1)
		  throw  new TaoBaoRuntimeExecption(-1,'readRefundMessages运行失败：参数错误');
		$paramarr=array('refund_id'=>$refund_id,'page_no'=>$page_no,'page_size'=>$page_size);
		if(! $fields) $fields=&$this->_getFields(new TaobaoRefundMessage());
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.refund.messages.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoRefundMessageList::$_DataLayerout['varclass']);
	}	
	/**
	 * 查询卖家收到的退款列表，taobao method: taobao.refunds.receive.get 
	 * @param TaobaoRefundList $result 要搜索退款信息列表
	 * @param TaobaoRefundListParam $param 查询参数
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoRefund的所有字段
	 * <br/>需要返回的字段，目前支持字段见refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee, oid, good_status, company_name, sid, payment, reason, desc, has_good_return, modified, order_status.
	 * @return TaobaoRefundList 返回退款信息列表 $result
	 */
	function readRefundsReceive(TaobaoRefundList $result,TaobaoRefundListReceiveParam $param,$fields=NULL) {
		if(! $result || ! $param)
		  throw  new TaoBaoRuntimeExecption(-1,'readRefundsReceive运行失败：参数错误');
		$paramarr=get_object_vars($param);
		if(! $fields) $fields='refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee, oid, good_status, company_name, sid, payment, reason, desc, has_good_return, modified, order_status';
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.refunds.receive.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoRefundList::$_DataLayerout['varclass']);
	}	
	/**
	 * 查询买家申请的退款列表，taobao method: taobao.refunds.apply.get
	 * @param TaobaoRefundList $result 要搜索退款信息列表
	 * @param TaobaoRefundListApplyParam $param 查询参数
	 * @param string $fields 查询字段。如果为空，自动传入所有字段
	 * <br/>需要返回的字段，目前支持字段见refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee.
	 * @return TaobaoRefundList 返回退款信息列表 $result
	 */
	function readRefundsApply(TaobaoRefundList $result,TaobaoRefundListApplyParam $param,$fields=NULL) {
		if(! $result || ! $param)
		  throw  new TaoBaoRuntimeExecption(-1,'readRefundsApply运行失败：参数错误');
		$paramarr=get_object_vars($param);
		if(! $fields) $fields='refund_id, tid, title, buyer_nick, seller_nick, total_fee, status, created, refund_fee';
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.refunds.apply.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoRefundList::$_DataLayerout['varclass']);
	}		
	/**
	 * 发货处理 ，taobao method: taobao.delivery.send
	 * <br/>对买家已付款状态的交易进行发货操作
	 * <br/>调用发货API成功，再次调用还是会返回成功，更换了参数信息还是会返回成功? 
	 * 如果调用发货API发货成功后。如果还对已经发货的交易id来进行发货的话，会一直返回成功信息。
	 * 即便是更换了参数信息也不会修改之前发货的记录
	 * @param DeliverySendParam $param 发货处理参数，类型@see DeliverySendParam
	 * @return boolean 成功 true
	 */
	function writeDeliverySend(DeliverySendParam $param){
		if(! $param)
		  throw  new TaoBaoRuntimeExecption(-1,'writeDeliverySend运行失败：参数错误');
		 if(strlen($param->memo)>250)  $param->memo=substr($param->memo,0,250); 
	    $paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.delivery.send',$paramarr);
		$result=new stdClass();
		$this->__firefillProperty($result,$resultarr);
		return $result->is_success;
	}
	/**
	 * 货到付款(cod)发货处理 ，taobao method: taobao.delivery.cod.send
	 * @param TaobaoDeliveryCodSendParam $param 发货处理参数
	 * @return boolean 成功 true
	 */
	function writeDeliveryCodSend(TaobaoDeliveryCodSendParam $param){
		if(! $param)
		  throw  new TaoBaoRuntimeExecption(-1,'writeDeliverySend运行失败：参数错误');
		$param->order_type='cod';
	    $paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.delivery.cod.send',$paramarr);
		$result=new stdClass();
		$this->__firefillProperty($result,$resultarr);
		return $result->is_success;
	}	
	/**
	 * 查询地址区域 ，taobao method: taobao.areas.get
	 * <br/>查询标准地址区域代码信息 
	 * 参考：http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm.
	 * @param array $areas   要填充地址区域，类型@see Area
	 * @param string $fields 查询字段。如果为空，自动传入Area的所有字段
	 * @return array 已经填充的地址区域，类型@see Area
	 */
	function &readAreas(array &$areas,$fields=NULL){
		if(! $fields) $fields=&$this->_getFields(new Area());
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.areas.get',$paramarr);
		$list=new _AreaList();
		$this->__firefillProperty($list,$resultarr,_AreaList::$_DataLayerout['varclass']);
		$areas=$list->areas;
		return $areas;		  
	}	
	/**
	 * 查询物流公司信息 ，taobao method: taobao.logistics.companies.get
	 * <br/>查询用于发货的物流公司信息
	 * @param array $companies   要填充物流公司信息，类型@see LogisticCompany
	 * @param boolean $is_recommended 是否查询推荐物流公司，可选值:true,false，
	 * 如果不提供此参数,将会返回所有支持电话联系的物流公司 
	 * @param string $order_mode 推荐物流公司的下单方式。
	 * <br/>可选值:offline(电话联系/自己联系),online(在线下单),all(即电话联系又在线下单)，
	 * <br/>此参数仅仅用于is_recommended 为ture时，就是说对于推荐物流公司才可用，
	 * 如果不选择此参数将会返回推荐物流中支持电话联系的物流公司。
	 * @param string $fields 查询字段。如果为空，自动传入LogisticCompany的所有字段
	 * @return array 已经填充的物流公司信息，返回的包含的具体信息为入参fields请求的字段信息，类型@see LogisticCompany
	 */
	function &readLogisticsCompanies(array &$result,$is_recommended=NULL,$order_mode=NULL,$fields=NULL){
		if(! isset($result))
		  throw  new TaoBaoRuntimeExecption(-1,'readLogisticsCompanies运行失败：参数错误');
		$paramarr=array('is_recommended'=>$is_recommended,'order_mode'=>$order_mode);
		if(! $fields) $fields=&$this->_getFields(new LogisticCompany());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.logistics.companies.get',$paramarr);
		
		$list=new _LogisticCompanyList();
		$this->__firefillProperty($list,$resultarr,_LogisticCompanyList::$_DataLayerout['varclass']);
		$result=$list->logistics_companies;
		return $result;		  
	}	
	/**
	 * 批量查询物流订单 ，taobao method: taobao.logistics.orders.get
	 * @param ShippingResult $result   要填充物流订单结果
	 * @param string $fields 查询字段。如果为空，自动传入Shipping的所有字段
	 * @return array 已经填充物流订单结果，类型@see ShippingResult
	 */
	function readLogisticsOrders(ShippingResult $result,ShippingParam $param,$fields=NULL){
		if(! $param || ! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readLogisticsOrdersDetail运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields=&$this->_getFields(new Shipping());
			$fields .=',receiver_location'; //taobao bug,param[receiver_location]->result[location] 
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.logistics.orders.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,ShippingResult::$_DataLayerout['varclass']);
	}		
	/**
	 * 批量查询物流订单,返回详细信息 ，taobao method: taobao.logistics.orders.detail.get
	 * @param ShippingResult $result   要填充物流订单结果
	 * @param ShippingParam $param   批量查询物流订单条件参数
	 * @param string $fields 查询字段。如果为空，自动传入Shipping的所有字段
	 * @return array 已经填充物流订单结果，类型@see ShippingResult
	 */
	function readLogisticsOrdersDetail(ShippingResult $result,ShippingParam $param,$fields=NULL){
		if(! $param || ! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readLogisticsOrdersDetail运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields=&$this->_getFields(new Shipping());
			$fields .=',receiver_location'; //taobao bug,param[receiver_location]->result[location] 
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.logistics.orders.detail.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,ShippingResult::$_DataLayerout['varclass']);
	}
	/**
	 * 查询partners物流公司信息，taobao method: taobao.logistics.partners.get 
	 * @param array $result   要填充物流公司信息，类型@see TaobaoLogisticsPartner
	 * @param string $service_type 服务类型，根据此参数可查出提供相应服务类型的物流公司信息(物流公司状态正常)，
	 * <br/>可选值：cod(货到付款)、online(在线下单)、 offline(自己联系)、limit(限时物流)。
	 * <br/>然后再根据source_id,target_id,goods_value这三个条件来过滤物流公司. 
	 * 目前输入自己联系服务类型将会返回空，因为自己联系并没有具体的服务信息，所以不会有记录。，
	 * @param string $source_id 物流公司揽货地地区码.
	 * 参考:http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm  或者调用 taobao.areas.get 获取
	 * @param string $target_id 物流公司派送地地区码.
	 * 参考:http://www.stats.gov.cn/tjbz/xzqhdm/t20080215_402462675.htm 或者调用 taobao.areas.get 获取
	 * @param string $goods_value 货物价格.只有当选择货到付款此参数才会有效
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoLogisticsPartner的所有字段
	 * @return array 已经填充的物流公司信息，类型@see TaobaoLogisticsPartner
	 */
	function &readLogisticsPartners(array &$result,$service_type,$source_id=NULL,$target_id=NULL,$goods_value=NULL,$fields=NULL){
		if(! isset($result) || ! $service_type)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsAll运行失败：参数错误');
		$paramarr=array('service_type'=>$service_type,'source_id'=>$source_id,
		    'target_id'=>$target_id,'goods_value'=>$goods_value);
		if(! $fields) $fields=&$this->_getFields(new TaobaoLogisticsPartner());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.logistics.partners.get',$paramarr);
		
		$list=new _TaobaoLogisticsPartnerList(); 
		$this->__firefillProperty($list,$resultarr,_TaobaoLogisticsPartnerList::$_DataLayerout['varclass']);
		$result=array();
		for($i=0;$i<count($list->logistics_partners);$i++){  //handle addition data
		   $result[]=$list->logistics_partners[$i]->partner;
		}
		return $result;		  
	}
	
	/**
	 * 获取当前会话用户的所有商品列表 ，taobao method: taobao.items.all.get
	 * <br/>获取当前用户作为卖家的所有商品的列表，并能根据传入的条件对商品列表进行过滤
	 * <br/>只能获得商品的部分信息，商品的详细信息请通过taobao.item.get获取
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param ItemGetListParam $param      获取商品列表条件参数
	 * @param string $fields 需返回的字段列表。
	 * 可选值：Item商品结构体中的以下字段：approve_status,iid,num_iid,title,nick,
	 * type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,
	 * has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,
	 * seller_cids,outer_id；字段之间用“,”分隔。
	 * <br/>不支持其他字段，如果需要获取其他字段数据，调用taobao.item.get。
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return ItemGetListResult 已经填充商品列表结果，类型@see ItemGetListResult
	 */ 
	function readItemsAll(ItemGetListResult $result,ItemGetListParam $param,$fields=NULL){
		if(! $param || ! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsAll运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields=
           'approve_status,iid,num_iid,title,nick,type,cid,pic_url,num,props,
           valid_thru,wlist_time,price,has_discount,has_invoice,has_warranty,
           has_showcase,modified,delist_time,postage_id,seller_cids,outer_id';			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.items.all.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,ItemGetListResult::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取当前会话用户出售中的商品列表 ，taobao method: taobao.items.onsale.get
	 * <br/>获取当前用户作为卖家的出售中的商品列表， 并能根据传入的搜索条件对出售中的
	 * 商品列表进行过滤 <br/>只能获得商品的部分信息，商品的详细信息请通过taobao.item.get获取
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param ItemGetListOnsaleParam $param      获取商品列表条件参数
	 * @param string $fields 需返回的字段列表。
	 * 可选值：Item商品结构体中的以下字段：approve_status,iid,num_iid,title,nick,
	 * type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,
	 * has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,
	 * seller_cids,outer_id；字段之间用“,”分隔。
	 * <br/>不支持其他字段，如果需要获取其他字段数据，调用taobao.item.get。
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return ItemGetListResult 已经填充商品列表结果，类型@see ItemGetListResult
	 */ 
	function readItemsOnsale(ItemGetListResult $result,ItemGetListOnsaleParam $param,$fields=NULL){
		if(! $param || ! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsAll运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields=
           'approve_status,iid,num_iid,title,nick,type,cid,pic_url,num,props,
           valid_thru,wlist_time,price,has_discount,has_invoice,has_warranty,
           has_showcase,modified,delist_time,postage_id,seller_cids,outer_id';			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.items.onsale.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,ItemGetListResult::$_DataLayerout['varclass']);
	}
	/**
	 * 得到当前会话用户库存中的商品列表 ，taobao method: taobao.items.inventory.get
	 * <br/>获取当前用户作为卖家的仓库中的商品列表，并能根据传入的搜索条件
	 * 对仓库中的商品列表进行过滤 <br/>只能获得商品的部分信息，商品的详细信息请通过taobao.item.get获取
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param ItemGetListInventoryParam $param      获取商品列表条件参数
	 * @param string $fields 需返回的字段列表。
	 * 可选值：Item商品结构体中的以下字段：approve_status,iid,num_iid,title,nick,
	 * type,cid,pic_url,num,props,valid_thru,list_time,price,has_discount,
	 * has_invoice,has_warranty,has_showcase,modified,delist_time,postage_id,
	 * seller_cids,outer_id；字段之间用“,”分隔。
	 * <br/>不支持其他字段，如果需要获取其他字段数据，调用taobao.item.get。
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return ItemGetListResult 已经填充商品列表结果，类型@see ItemGetListResult
	 */ 
	function readItemsInventory(ItemGetListResult $result,ItemGetListInventoryParam $param,$fields=NULL){
		if(! $param || ! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsAll运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields=
           'approve_status,iid,num_iid,title,nick,type,cid,pic_url,num,props,
           valid_thru,wlist_time,price,has_discount,has_invoice,has_warranty,
           has_showcase,modified,delist_time,postage_id,seller_cids,outer_id';			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.items.inventory.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,ItemGetListResult::$_DataLayerout['varclass']);
	}
	/**
	 * 批量获取商品信息 ，taobao method: taobao.items.list.get
	 * <br/>1.传入的iids所对应的商品必须属于同一个用户 2.查看非公开属性时需要用户登录 3.同时传入iids和num_iids以num_iids为主
	 * @param ItemGetListResult $result   要填充商品列表结果
	 * @param string  $num_iids 商品数字id列表，多个num_iid用逗号隔开，一次不超过20个。
	 * @param string  $iids  商品字符串编号或数字编号均可，也可以混合使用，多个iid用逗号隔开，一次不超过20个。
	 * @param string $fields 需要返回的商品对象字段。可选值：Item商品结构体中所有字段均可返回；
	 * 多个字段用“,”分隔。如果想返回整个子对象，那字段为itemimg，如果是想返回子对象里面的字段，那字段为itemimg.url。
	 * @return array 已经填充商品列表，类型@see TItem
	 */ 
	function &readItemsList($num_iids,$iids=NULL,$fields=NULL,$needdesc=false){
		if(! $num_iids && ! $iids)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsList运行失败：参数错误');
	
		$paramarr=array('num_iids'=>$num_iids,'iids'=>$iids);
		if(! $fields){
			$fields=&$this->_getFields(new TItem());
			if(! $needdesc) $fields=str_replace(',desc','',$fields);
			$fields .=',item_img,prop_img,sku,video,one_station';			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.items.list.get',$paramarr);
		$result=new ItemGetListResult(); 
		$this->__firefillProperty($result,$resultarr,ItemGetListResult::$_DataLayerout['varclass']);
		return $result->items;
	}				
	/**
	 * 查询单个商品详细信息  ，taobao method: taobao.item.get
	 * <br/>获取单个商品的详细信息
	 * <br/>卖家未登录时只能获得这个商品的公开数据，卖家登录后可以获取商品的所有数据
	 * <br/>怎样取到自定义颜色属性名? 在取商品的时候，加上 property_alias字段，
	 * 返回结果如: "1627207: 90554: 金色"其中1627207: 90554是pid: vid对和props字段中的pid: vid
	 * 解析方式一样。"金色"颜色是别名。
	 * <br/>为什么下架商品取不到?只有商品的所有者登录后才能看到下架的商品。
	 * <br/>直冲类商品取不到商品?商城的直冲商品，现在还不支持。
	 * @param TItem $result   要填充商品对象
	 * @param string $nick    卖家昵称,如果昵称为中文，要用UTF-8编码
	 * @param string $iid     商品id 
	 * @param string $num_iid 商品数字id  
	 * @param string $fields  需要返回的商品对象字段。
	 * 可选值：Item商品结构体中所有字段均可返回；多个字段用“,”分隔。
	 * 如果想返回整个子对象，那字段为item_img， 如果是想返回子对象里面的字段，
	 * 那字段为item_img.url。 新增返回字段：one_station标记商品是否淘1站商品
	 * <br/>如果为空，自动返回所有字段
	 * @param boolean $needdesc 是否需要desc字段，默认false，仅当$fields=NULL有效。
	 * desc字段字数要大于5个字节，小于25000个字节，一般较大，如需要单独取得。
	 * @return array 已经填充商品列表结果，类型@see ItemGetListResult
	 */ 
	function readItem(TItem $result,$nick,$iid=NULL,$num_iid=NULL,$fields=NULL,$needdesc=false){
		if(! $nick || ! $result || (!$iid && !$num_iid))
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsAll运行失败：参数错误');
	
		$paramarr=array('nick'=>$nick,'iid'=>$iid,'num_iid'=>$num_iid);
		if(! $fields){
			$fields=&$this->_getFields(new TItem());
			if(! $needdesc) $fields=str_replace(',desc','',$fields);
			$fields .=',item_img,prop_img,sku,video,one_station'; //add class			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.item.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TItem::$_DataLayerout['varclass']);
	}	
	
	/**
	 * 根据卖家设定的商品外部id获取商品 ，taobao method: taobao.items.custom.get
	 * <br/>跟据卖家设定的商品外部id获取商品 这个商品对应卖家从传入的session中获取，需要session绑定
	 * <br/>什么是商品的外部商家ID？外部商家自己定义的商品ID 
	 * @param array $result   要填充商品对象列表
	 * @param string $outer_id    商品的外部商品ID 
	 * @param string $fields  需要返回的商品对象字段。
	 * 可选值：Item商品结构体中所有字段均可返回；多个字段用“,”分隔。
	 * 如果想返回整个子对象，那字段为item_img， 如果是想返回子对象里面的字段，
	 * 那字段为item_img.url。 新增返回字段：one_station标记商品是否淘1站商品
	 * <br/>如果为空，自动返回所有字段
	 * @param boolean $needdesc 是否需要desc字段，默认false，仅当$fields=NULL有效。
	 * desc字段字数要大于5个字节，小于25000个字节，一般较大，如需要单独取得。
	 * @return array 已经填充商品列表结果，类型@see TItem
	 */ 
	function &readItemsCustom(array &$result,$outer_id,$fields=NULL,$needdesc=false){
		if(! $outer_id )
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsCustom运行失败：参数错误');
	
		$paramarr=array('outer_id'=>$outer_id);
		if(! $fields){
			$fields=&$this->_getFields(new TItem());
			if(! $needdesc) $fields=str_replace(',desc','',$fields);
			$fields .=',item_img,prop_img,sku,video,one_station'; //add class			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.items.custom.get',$paramarr);
		$list=new ItemGetListResult();
		$this->__firefillProperty($list,$resultarr,ItemGetListResult::$_DataLayerout['varclass']);
		$result=$list->items;
		return $result;
	}	
	/**
	 * 获取单个SKU，taobao method: taobao.item.sku.get
	 * <br/>获取sku_id所对应的sku数据
	 * <br/>sku_id对应的sku要属于传入的nick对应的卖家
	 * @param Sku $result   要填充Sku
	 * @param integer $sku_id    Sku的id。可以通过taobao.item.get得到 
	 * @param integer $num_iid    商品的数字IID 
	 * @param string $fields  需返回的字段列表。可选值：Sku结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充Sku，类型@see Sku
	 */ 
	function readItemSku(Sku $result,$sku_id,$num_iid,$fields=NULL){
		if(! $result ||  ! $sku_id || ! $num_iid)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemSku运行失败：参数错误');
	
		$paramarr=array('sku_id'=>$sku_id,'num_iid'=>$num_iid);
		if(! $fields) $fields=&$this->_getFields($result);
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.item.sku.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 根据卖家昵称和商品ID列表获取SKU信息，taobao method: taobao.item.skus.get
	 * <br/>获取多个商品下的所有sku  <br/>输入的iid必须都属于nick对应的用户 
	 * <br/>同时传入iids和num_iids，以num_iids为主
	 * @param array $result   要填充Sku列表
	 * @param string $nick   商品所属卖家昵称  
	 * @param string $num_iids  商品数字ID列表，多个之间用“,”分隔，最多40个。iids和num_iids选择一个传入  
	 * @param string $iids   商品字符串ID列表，多个之间用“,”分隔，最多40个。iids和num_iids选择一个传入 
	 * @param string $fields  需返回的字段列表。可选值：Sku结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充Sku列表，类型@see Sku
	 */ 
	function readItemSkus(array &$result,$nick,$num_iids,$iids=NULL,$fields=NULL){
		if(! $nick || (! $num_iids && ! $iids) )
		  throw  new TaoBaoRuntimeExecption(-1,'readItemSkus运行失败：参数错误');
	
		$paramarr=array('nick'=>$nick,'num_iids'=>$num_iids,'iids'=>$iids);
		if(! $fields) $fields=&$this->_getFields(new Sku());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.item.skus.get',$paramarr);
		$list=new TItem();
		$this->__firefillProperty($list,$resultarr,array('skus'=>'Sku'));
		$result=$list->skus;
		return $result;
	}	
	/**
	 * 根据外部ID取商品SKU，taobao method: taobao.skus.custom.get
	 * <br/>跟据卖家设定的Sku的外部id获取商品，如果一个outer_id对应多个Sku会返回所有符合条件的sku 
	 * <br/>这个Sku所属卖家从传入的session中获取，需要session绑定
	 * @param array $result   要填充Sku列表
	 * @param string $outer_id   Sku的外部商家ID  
	 * @param string $fields  需返回的字段列表。可选值：Sku结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充Sku列表，类型@see Sku
	 */ 
	function readSkusCustom(array &$result,$outer_id ,$fields=NULL){
		if(! $outer_id)
		  throw  new TaoBaoRuntimeExecption(-1,'readSkusCustom运行失败：参数错误');
	
		$paramarr=array('outer_id'=>$outer_id);
		if(! $fields) $fields=&$this->_getFields(new Sku());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.skus.custom.get',$paramarr);
		$list=new TItem();
		$this->__firefillProperty($list,$resultarr,array('skus'=>'Sku'));
		$result=$list->skus;
		return $result;
	}	
	/**
	 * 搜索商品信息 ，taobao method: taobao.items.search
	 * <br/>搜索商品全部信息，包括类目及数量
	 * @param TaobaoItemSearchResult $result   要填充搜索商品信息结果
	 * @param TaobaoItemSearchParam $param      搜索商品信息参数
	 * @param string $fields 需返回的商品结构字段列表。
	 * 可选值为Item中的以下字段：iid,title,nick,pic_url,cid,price,type,delist_time,post_fee；
	 * 多个字段之间用“,” 分隔。如：iid,title。
	 * 新增字段location（卖家地址，可以分别获取location.city,location.state）
	 * <br/>如果为空，自动返回所有支持的字段
	 * @return TaobaoItemSearchResult 已经填充搜索商品信息结果
	 */ 
	function readItemsSearch(TaobaoItemSearchResult $result,TaobaoItemSearchParam $param,$fields=NULL){
		if(! $param || ! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemsSearch运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields='iid,title,nick,pic_url,cid,price,type,delist_time,post_fee,location.city,location.state';			
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.items.search',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoItemSearchResult::$_DataLayerout['varclass']);
	}	
	/**
	 * 添加一个商品，taobao method: taobao.item.add
	 * <br/>此接口用于新增一个商品 商品所属的卖家是当前会话的用户 商品的属性和sku的属性有包含的关系，商品的价格要位于sku的价格区间之中
	 * （例如，sku价格有5元、10元两种，那么商品的价格就需要大于等于5元，小于等于10元，否则新增商品会失败） 商品的类目和商品的价格、sku的价格都有一定的相关性
	 * （具体的关系要通过类目属性查询接口获得） 商品的运费承担方式和邮费设置有相关性，卖家承担运费不用设置邮费，
	 * 买家承担运费需要设置邮费 当关键属性值选择了“其他”的时候，需要输入input_pids和input_str商品才能添加成功。
	 * <br/>添加一个商品，必须设置参数：num,price,type,stuff_status,title,desc,location.state,location.city,cid
	 * @param TaobaoItemAddParam $param   添加商品参数
	 * @return TItem 商品结构，包括：num_iid,created
	 */ 
	function writeItemAdd(TaobaoItemAddParam $param){
		if(! $param || ! $param->num || !$param->price || !$param->type || !$param->stuff_status
		   || !$param->title || !$param->desc || !$param->location_state || !$param->location_city
		   || !$param->cid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemAdd运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		unset($paramarr['location_city']);
		unset($paramarr['location_state']);
		unset($paramarr['image']);
		if($param->location_city)  $paramarr['location.city']=$param->location_city;
		if($param->location_state) $paramarr['location.state']=$param->location_state;
		if(!$param->pic_path && $param->image && file_exists($param->image)){
		    $request=clone $this->request;
		    $request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		    $request->postWithFiles['image']=$param->image;
		    $resultarr=&$this->__fireRequest('taobao.item.add',$paramarr,false,$request);
		    $request=NULL;
		}else{		
		  $resultarr = &$this->__fireRequest('taobao.item.add',$paramarr,false);
		}
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 删除单条商品，taobao method: taobao.item.delete
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：num_iid,created
	 */ 
	function writeItemDelete($num_iid,$iid=NULL){
		if(! $num_iid && ! $iid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemDelete运行失败：参数错误');
	
		$paramarr=array('num_iid'=>$num_iid,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.delete',$paramarr);
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 更新商品信息，taobao method: taobao.item.update
	 * <br/>根据传入的iid更新对应的商品的数据  
	 * <br/>传入的iid所对应的商品必须属于当前会话的用户
	 * <br/>商品的属性和sku的属性有包含的关系，商品的价格要位于sku的价格区间之中
	 * （例如，sku价格有5元、10元两种，那么商品的价格就需要大于等于5元，小于等于10元， 否则更新商品会失败）
	 * <br/>商品的类目和商品的价格、sku的价格都有一定的相关性（具体的关系要通过类目属性查询接口获得）
	 * <br/>当关键属性值更新为“其他”的时候，需要输入input_pids和input_str商品才能更新成功
	 * <br/>如果要更新多个sku信息的，sku _quantities，sku _prices，sku_outer_ids，
	 * sku _properties这些信息是必填的 <br/>同时传入iid和num_iid，以num_iid为主
	 * @param TaobaoItemUpdateParam $param   要更新商品信息的参数， <br/>iid和num_iid选择一个传入
	 * @return string 商品修改时间 时间格式：yyyy-MM-dd HH:mm:ss 
	 */ 
	function writeItemUpdate(TaobaoItemUpdateParam $param){
		if(! $param  || (!$param->num_iid && !$param->iid))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemUpdate运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		unset($paramarr['location_city']);
		unset($paramarr['location_state']);
		unset($paramarr['image']);
		if($param->location_city)  $paramarr['location.city']=$param->location_city;
		if($param->location_state) $paramarr['location.state']=$param->location_state;
		if(!$param->pic_path && $param->image && file_exists($param->image)){
		    $request=clone $this->request;
		    $request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		    $request->postWithFiles['image']=$param->image;
		    $resultarr=&$this->__fireRequest('taobao.item.update',$paramarr,true,$request);
		    $request=NULL;
		}else		
		  $resultarr = &$this->__fireRequest('taobao.item.update',$paramarr);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(property_exists($list,'modified'))
		   return $list->modified;
	}	
	/**
	 * 删除商品图片，taobao method: taobao.item.img.delete
	 * @param integer $id        商品图片ID
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TaobaoItemImg 商品图片结构，包括：num_iid,created
	 */ 
	function writeItemImgDelete($id,$num_iid,$iid=NULL){
		if(! $num_iid || ! isset($id))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemImgDelete运行失败：参数错误');
	 
		$paramarr=array('id'=>$id,'num_iid'=>$num_iid,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.img.delete',$paramarr);
		$result=new TaobaoItemImg();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 添加商品图片，taobao method: taobao.item.img.upload
	 * <br/>添加一张商品图片到iid指定的商品中 传入的iid所对应的商品必须属于当前会话的用户 如果更新图片需要设置itemimg_id，
	 * 且该itemimg_id的图片记录需要属于传入的iid对应的商品。如果新增图片则不用设置 商品图片有数量和大小上的限制，
	 * 根据卖家享有的服务（如：卖家订购了多图服务等），商品图片数量限制不同。
	 * @param TaobaoItemImgUploadParam $param   添加商品图片参数
	 * @return TaobaoItemImg 商品图片结构，包括：num_iid,created
	 */ 
	function writeItemImgUpload(TaobaoItemImgUploadParam $param){
		if(! $param || (! $param->num_iid && !$param->iid) )
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemImgUpload运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		unset($paramarr['image']);
		if($param->image && file_exists($param->image)){
		    $request=clone $this->request;
		    $request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		    $request->postWithFiles['image']=$param->image;                       //old use  "image",now use "imageData"  2010-08-10
		    $resultarr=&$this->__fireRequest('taobao.item.img.upload',$paramarr,false,$request);
		    $request=NULL;
		}else		
		  $resultarr = &$this->__fireRequest('taobao.item.img.upload',$paramarr,false);
		$result=new TaobaoItemImg();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * @deprecated 商品关联子图，taobao method: taobao.item.joint.img
	 * @param TaobaoItemImgJointParam $param   关联商品图片参数
	 * @return TaobaoItemImg 商品图片结构，包括：num_iid,created
	 */ 
	function writeItemJointImg(TaobaoItemImgJointParam $param){
		if(! $param || (! $param->num_iid && !$param->iid) ||!$param->pic_path )
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemJointImg运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
   	    $resultarr = &$this->__fireRequest('taobao.item.joint.img',$paramarr,false);
		$result=new TaobaoItemImg();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * @deprecated 商品关联属性图，taobao method: taobao.item.joint.propimg
	 * @param TaobaoItemPropImgJointParam $param   关联商品属性图片参数
	 * @return TaobaoPropImg 属性图片对象信息，包括：num_iid,created
	 */ 
	function writeItemJointPropImg(TaobaoItemPropImgJointParam $param){
		if(! $param || (! $param->num_iid && !$param->iid) 
		   ||!$param->pic_path ||!$param->properties)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemJointPropImg运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
   	    $resultarr = &$this->__fireRequest('taobao.item.joint.propimg',$paramarr,false);
		$result=new TaobaoPropImg();
		return $this->__firefillProperty($result,$resultarr);
	}
	/**
	 * 删除属性图片，taobao method: taobao.item.propimg.delete
	 * @param integer $id        商品图片ID
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TaobaoPropImg 属性图片对象信息，包括：num_iid,created
	 */ 
	function writeItemPropImgDelete($id,$num_iid,$iid=NULL){
		if(! $num_iid || ! $id)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemPropImgDelete运行失败：参数错误');
	 
		$paramarr=array('id'=>$id,'num_iid'=>$num_iid,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.propimg.delete',$paramarr);
		$result=new TaobaoPropImg();
		return $this->__firefillProperty($result,$resultarr);
	}		
	/**
	 * 添加或修改属性图片，taobao method: taobao.item.propimg.upload
	 * @param TaobaoItemPropImgUploadParam $param   添加或修改属性图片参数
	 * @return TaobaoPropImg 属性图片对象信息，包括：num_iid,created
	 */ 
	function writeItemPropImgUpload(TaobaoItemPropImgUploadParam $param){
		if(! $param || (! $param->num_iid && !$param->iid) ||! $param->image)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemPropImgUpload运行失败：参数错误');
	    if(! file_exists($param->image))
		   throw  new TaoBaoRuntimeExecption(-1,'writeItemPropImgUpload运行失败：找不到' . $param->image);	    
		$paramarr=get_object_vars($param);
		unset($paramarr['image']);
		$request=clone $this->request;
		$request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['image']=$param->image;
		$resultarr=&$this->__fireRequest('taobao.item.propimg.upload',$paramarr,false,$request);
		$request=NULL;
		$result=new TaobaoPropImg();
		return $this->__firefillProperty($result,$resultarr);
	}
	/**
	 * 橱窗推荐一个商品，taobao method: taobao.item.recommend.add
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid
	 */ 
	function writeItemRecommendAdd($num_iid,$iid=NULL){
		if(! $num_iid && ! $iid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemRecommendAdd运行失败：参数错误');
		$paramarr=array('num_iid'=>$num_iid,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.recommend.add',$paramarr);
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}
	/**
	 * 取消橱窗推荐一个商品，taobao method: taobao.item.recommend.delete
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid,modified
	 */ 
	function writeItemRecommendDelete($num_iid,$iid=NULL){
		if(! $num_iid && ! $iid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemRecommendDelete运行失败：参数错误');
		$paramarr=array('num_iid'=>$num_iid,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.recommend.delete',$paramarr);
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 更新商品特定字段(TBS专用)，taobao method: taobao.item.tbsupdate
	 * @param integer $num_iid   商品数字ID。
	 * @param boolean $is_taobao 是否在淘宝显示。is_taobao和is_ex两个中至少输入一个
	 * @param boolean $is_ex     是否在外部网店显示。is_taobao和is_ex两个中至少输入一个
	 * @param string $iid        商品ID。
	 * @return TItem 商品结构，包括：num_iid,modified
	 */ 
	function writeItemTbsUpdate($num_iid,$is_taobao,$is_ex,$iid=NULL){
		if((! $num_iid && ! $iid) || (!isset($is_taobao) && !isset($is_ex)))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemTbsUpdate运行失败：参数错误');
		$paramarr=array('num_iid'=>$num_iid,'is_taobao'=>$is_taobao,'is_ex'=>$is_ex,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.tbsupdate',$paramarr);
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 商品下架，taobao method: taobao.item.update.delisting
	 * <br/>单个商品下架 * 输入的num_iid必须属于当前会话用户
	 * @param integer $num_iid   商品数字ID。
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid,modified
	 */ 
	function writeItemUpdateDelisting($num_iid,$iid=NULL){
		if(! $num_iid && ! $iid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemUpdateDelisting运行失败：参数错误');
		$paramarr=array('num_iid'=>$num_iid,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.update.delisting',$paramarr);
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 一口价商品上架，taobao method: taobao.item.update.listing
	 * <br/>单个商品上架 * 输入的num_iid必须属于当前会话用户
	 * @param integer $num_iid   商品数字ID。
	 * @param integer $num   需要上架的商品的数量。取值范围:大于零的整数。
	 * 如果商品有sku，则上架数量默认为所有sku数量总和，不可修改。 否则商品数量根据设置数量调整为 num
	 * @param string $iid       商品ID。
	 * @return TItem 商品结构，包括：iid,modified
	 */ 
	function writeItemUpdateListing($num_iid,$num,$iid=NULL){
		if(!$num && (! $num_iid && ! $iid))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemUpdateDelisting运行失败：参数错误');
		$paramarr=array('num_iid'=>$num_iid,'num'=>$num,'iid'=>$iid);
		$resultarr = &$this->__fireRequest('taobao.item.update.listing',$paramarr);
		$result=new TItem();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 添加SKU，taobao method: taobao.item.sku.add
	 * <br/>新增一个sku到iid指定的商品中 <br/>传入的iid所对应的商品必须属于当前会话的用户
	 * <br/>同时传入iid和num_iid，以num_iid为主
	 * @param SkuParam $param   要添加Sku参数<br/>iid和num_iid选择一个传入 
	 * <br/>properties是必须参数 <br/>price 必须参数   商品的价格要在商品所有的sku的价格之间
	 * <br/>quantity 必须参数   sku的总数量应该小于等于商品总数量(Item的NUM)。取值范围:大于零的整数 
	 * @return string 创建时间。格式:yyyy-MM-dd HH:mm:ss 
	 */ 
	function writeItemSkuAdd(SkuParam $param){
		if(! $param || ! $param->properties || $param->quantity || $param->price
		  || (!$param->num_iid && !$param->iid))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemSkuAdd运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.item.sku.add',$paramarr,false);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(property_exists($list,'created'))
		   return $list->created;
	}		
	/**
	 * 更新SKU信息，taobao method: taobao.item.sku.update
	 * <br/>更新一个sku的数据  <br/>需要更新的sku通过属性properties进行匹配查找
	 * <br/>商品的数量和价格必须大于等于0 <br/>sku记录会更新到指定的iid对应的商品中
	 * <br/>iid对应的商品必须属于当前的会话用户 <br/>同时传入iid和num_iid，以num_iid为主
	 * <br/>taobao.item.sku.update能否同时更新多组sku?不能同时更新多组sku,只能每次更新一组
	 * @param SkuParam $param   要更新Sku参数<br/>iid和num_iid选择一个传入<br/>properties是必须参数
	 * <br/>quantity sku的总数量应该小于等于商品总数量(Item的NUM)。取值范围:大于等于零的整数
	 * <br/>price 修改后的sku价格要保证商品的价格在所有sku价格所形成的价格区间内
	 * （例如：商品价格为6元，sku价格有5元、10元两种，如果要修改5元sku的价格， 那么修改的范围
	 * 只能是0-6元之间；如果要修改10元的sku， 那么修改的范围只能是6到无穷大的区间中）
	 * @return string Sku的修改时间。格式:yyyy-MM-dd HH:mm:ss
	 */ 
	function writeItemSkuUpdate(SkuParam $param){
		if(! $param || ! $param->properties || (!$param->num_iid && !$param->iid))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemSkuUpdate运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.item.sku.update',$paramarr);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(property_exists($list,'modified'))
		   return $list->modified;
	}		

	/**
	 * 删除SKU，taobao method: taobao.item.sku.delete
	 * <br/>删除一个sku的数据  <br/>需要删除的sku通过属性properties进行匹配查找
	 * <br/>可删除还有剩余库存的SKU <br/>同时传入iid和num_iid，以num_iid为主
	 * @param SkuParam $param   要删除Sku参数 <br/>iid和num_iid选择一个传入<br/>properties是必须参数
	 * <br/>quantity sku所属商品的数量,大于0的整数。当用户删除sku，
	 * 使商品数量不等于sku数量之和时候，用于修改商品的数量，使sku能够删除成功。
	 * 特别是删除最后一个sku的时候，一定要设置商品数量到正常的值，否则删除失败 
	 * <br/>price    sku所属商品的价格。当用户删除sku，使商品价格不属于sku价格之间的时候，
	 * 用于修改商品的价格，使sku能够删除成功
	 * @return string Sku的删除时间。格式:yyyy-MM-dd HH:mm:ss
	 */ 
	function writeItemSkuDelete(SkuParam $param){
		if(! $param || ! $param->properties || (!$param->num_iid && !$param->iid))
		  throw  new TaoBaoRuntimeExecption(-1,'writeItemSkuDelete运行失败：参数错误');
	
		$paramarr=array('iid'=>$param->iid,'num_iid'=>$param->num_iid,
		  'properties'=>$param->properties,'item_price'=>$param->price,
		  'item_num'=>$param->quantity,'lang'=>$param->lang );
		
		$resultarr = &$this->__fireRequest('taobao.item.sku.delete',$paramarr,false);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(property_exists($list,'modified'))
		   return $list->modified;
	}	
	/**
	 * 添加邮费模板，taobao method: taobao.postage.add
	 * @param TaobaoPostageAddParam $param   添加邮费模板参数
	 * <br/>必填字段:name。特殊可选：post,express,ems
	 * @return TaobaoPostage 返回参数， 包括postage_id：运费模板ID；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */ 
	function writePostageAdd(TaobaoPostageAddParam $param){
		if(! $param || ! $param->name )
		  throw  new TaoBaoRuntimeExecption(-1,'writePostageAdd运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.postage.add',$paramarr,false);
		$result=new TaobaoPostage();
		return $this->__firefillProperty($result,$resultarr,TaobaoPostage::$_DataLayerout['varclass']);
	}
	/**
	 * 删除单个运费模板，taobao method: taobao.postage.delete
	 * @param integer $postage_id   邮费模板id
	 * @return TaobaoPostage 返回参数， 包括postage_id：运费模板ID；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */ 
	function writePostageDelete($postage_id){
		if(! $postage_id )
		  throw  new TaoBaoRuntimeExecption(-1,'writePostageDelete运行失败：参数错误');
	
		$paramarr=array('postage_id'=>$postage_id);
		$resultarr = &$this->__fireRequest('taobao.postage.delete',$paramarr,false);
		$result=new TaobaoPostage();
		return $this->__firefillProperty($result,$resultarr,TaobaoPostage::$_DataLayerout['varclass']);
	}		
	/**
	 * 修改邮费模板，taobao method: taobao.postage.update
	 * @param TaobaoPostageUpdateParam $param   修改邮费模板参数
	 * <br/>必填字段:postage_id。特殊可选：post,express,ems
	 * @return TaobaoPostage 返回参数， 包括postage_id：运费模板ID；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */ 
	function writePostageUpdate(TaobaoPostageUpdateParam $param){
		if(! $param || ! $param->postage_id )
		  throw  new TaoBaoRuntimeExecption(-1,'writePostageUpdate运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.postage.update',$paramarr,false);
		$result=new TaobaoPostage();
		return $this->__firefillProperty($result,$resultarr,TaobaoPostage::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取卖家的运费模板，taobao method: taobao.postages.get
	 * @param array $result 要填充的卖家的运费模板列表，类型：@see TaobaoPostage
	 * @param string $fields 需返回的字段列表.如果为空，自动传入TaobaoPostage结构体的所有字段
	 * <br/>可选值:TaobaoPostage结构体中的所有字段;字段之间用","分隔。 
	 * @return array 返回已经填充的卖家的运费模板，类型：@see TaobaoPostage
	 */
	function &readPostages(array &$result,$fields=NULL) {
		if(! isset($result) )
		  throw  new TaoBaoRuntimeExecption(-1,'readPostages运行失败：参数错误');
	
		$paramarr=array();
		if(! $fields){
			$fields=&$this->_getFields(new TaobaoPostage());
			$fields .=',postage_mode.id,postage_mode.type,postage_mode.dests,postage_mode.price,postage_mode.increase';
		} 
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.postages.get',$paramarr);
		$list=new _TaobaoPostageList();
		$this->__firefillProperty($list,$resultarr,_TaobaoPostageList::$_DataLayerout['varclass']);
		$result=$list->postages;
		return $result;
	}	
	/**
	 * 获取单个运费模板，taobao method: taobao.postage.get
	 * @param TaobaoPostage $result 要填充的运费模板
	 * @param string $postage_id 邮费模板id
	 * @param string $nick 卖家昵称
	 * @param string $fields 需返回的字段列表.如果为空，自动传入TaobaoPostage结构体的所有字段
	 * <br/>可选值:TaobaoPostage结构体中的所有字段;字段之间用","分隔。 
	 * @return TaobaoPostage 返回已经填充的运费模板
	 */
	function readPostage(TaobaoPostage $result,$postage_id,$nick,$fields=NULL) {
		if(!$result ||! $postage_id || !$nick )
		  throw  new TaoBaoRuntimeExecption(-1,'readPostage运行失败：参数错误');
	
		$paramarr=array('postage_id'=>$postage_id,'nick'=>$nick);
		if(! $fields){
			$fields=&$this->_getFields($result);
			$fields .=',postage_mode.id,postage_mode.type,postage_mode.dests,postage_mode.price,postage_mode.increase';
		} 
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.postage.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoPostage::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取一个产品的信息，taobao method: taobao.product.get 
	 * @param TaobaoProduct $result 要填充的产品信息
	 * @param string $product_id Product的id.两种方式来查看一个产品:1.传入product_id来查询 2.传入cid和props来查询
	 * @param string $cid 商品类目id.调用taobao.itemcats.get获取;必须是叶子类目id,如果没有传product_id,那么cid和props必须要传
	 * @param string $props 比如:诺基亚N73这个产品的关键属性列表就是:品牌:诺基亚;型号:N73,对应的PV值就是10005:10027;10006:29729
	 * @param string $fields 需返回的字段列表.
	 * 如果为空，自动传入Product结构体的所有字段，包括product_imgs,product_prop_imgs;
	 * <br/>可选值:Product数据结构中的所有字段;多个字段之间用","分隔。 
	 * @return TaobaoProduct 返回已经填充的产品信息
	 */
	function readProduct(TaobaoProduct $result,$product_id,$cid=NULL,$props=NULL,$fields=NULL) {
		if(!$result || (!$product_id && (!$cid || !$props) )  )
		  throw  new TaoBaoRuntimeExecption(-1,'readProduct运行失败：参数错误');
	
		$paramarr=array('product_id'=>$product_id,'cid'=>$cid,'props'=>$props);
		if(! $fields ){
			$fields=&$this->_getFields($result);
			 $fields .=',product_imgs.id,product_imgs.url,product_imgs.position,product_imgs.created,product_imgs.modified';
			 $fields .=',product_prop_imgs.id,product_prop_imgs.props,product_prop_imgs.url,product_prop_imgs.position,product_prop_imgs.created,product_prop_imgs.modified';
		} 
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.product.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoProduct::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取产品列表，taobao method: taobao.products.get 
	 * @param array $result 要填充的产品列表，类型@TaobaoProduct
	 * @param string $nick 卖家昵称
	 * @param string $page_no 页码.传入值为1代表第一页,传入值为2代表第二页,依此类推.默认返回的数据是从第一页开始.
	 * @param string $page_size 每页条数.每页返回最多返回100条,默认值为40.
	 * @param string $fields 需返回的字段列表.
	 * 如果为空，自动传入Product结构体的所有字段，不包括product_imgs,product_prop_imgs;
	 * 如果为ALL，自动传入Product结构体的所有字段，包括product_imgs,product_prop_imgs;
	 * <br/>可选值:Product数据结构中的所有字段;多个字段之间用","分隔。 
	 * @return array 返回已经填充的产品列表，类型@TaobaoProduct
	 */
	function &readProducts(array &$result,$nick,$page_no=1,$page_size=40,$fields=NULL) {
		if(! isset($result) ||  !$nick )
		  throw  new TaoBaoRuntimeExecption(-1,'readProducts运行失败：参数错误');
	
		$paramarr=array('nick'=>$nick,'page_no'=>$page_no,'page_size'=>$page_size);
		if(! $fields || $fields==='ALL'){
			$fields=&$this->_getFields(new TaobaoProduct());
			if($fields==='ALL'){
			 $fields .=',product_imgs.id,product_imgs.url,product_imgs.position,product_imgs.created,product_imgs.modified';
			 $fields .=',product_prop_imgs.id,product_prop_imgs.props,product_prop_imgs.url,product_prop_imgs.position,product_prop_imgs.created,product_prop_imgs.modified';
		  }
		} 
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.products.get',$paramarr);
		$list=new TaobaoProductList();
		$this->__firefillProperty($list,$resultarr,TaobaoProductList::$_DataLayerout['varclass']);
		$result=$list->products;
		return $result;
	}	
	/**
	 * 获取产品列表，taobao method: taobao.products.search 
	 * @param TaobaoProductSearchResult $result 要填充的产品列表
	 * @param TaobaoProductSearchParam $param 获取产品列表参数
	 * @param string $fields 需返回的字段列表.
	 * 如果为空，自动传入Product结构体的所有字段，不包括product_imgs,product_prop_imgs;
	 * 如果为ALL，自动传入Product结构体的所有字段，包括product_imgs,product_prop_imgs;
	 * <br/>可选值:Product数据结构中的所有字段;多个字段之间用","分隔。 
	 * @return TaobaoProductSearchResult 返回已经填充的产品列表
	 */
	function readProductsSearch(TaobaoProductSearchResult $result,TaobaoProductSearchParam $param,$fields=NULL) {
		if(! $result ||  !$param || (!$param->q && (!$param->cid || !$param->props) ))
		  throw  new TaoBaoRuntimeExecption(-1,'readProductsSearch运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields || $fields==='ALL'){
			$fields=&$this->_getFields(new TaobaoProduct());
			if($fields==='ALL'){
			 $fields .=',product_imgs.id,product_imgs.url,product_imgs.position,product_imgs.created,product_imgs.modified';
			 $fields .=',product_prop_imgs.id,product_prop_imgs.props,product_prop_imgs.url,product_prop_imgs.position,product_prop_imgs.created,product_prop_imgs.modified';
		  }
		}  
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.products.search',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoProductSearchResult::$_DataLayerout['varclass']);
	}	
	/**
	 * 上传一个产品，不包括产品非主图和属性图片，包括产品主图，taobao method: taobao.product.add
	 * @param TaobaoProductAddParam $param   添加产品参数
	 * @return TaobaoProduct 返回参数， 包括product_id；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */ 
	function writeProductAdd(TaobaoProductAddParam $param){
		if(! $param || ! $param->cid || !$param->name || !$param->price )
		  throw  new TaoBaoRuntimeExecption(-1,'writeProductAdd运行失败：参数错误');
	    if(!$param->image || !file_exists($param->image))
	      throw  new TaoBaoRuntimeExecption(-1,'writeProductAdd运行失败：找不到产品主图片');
		$paramarr=get_object_vars($param);
		unset($paramarr['image']);
		$request=clone $this->request;
		$request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['image']=$param->image;
		$resultarr=&$this->__fireRequest('taobao.product.add',$paramarr,false,$request);
		$request=NULL;
		$result=new TaobaoProduct();
		return $this->__firefillProperty($result,$resultarr);
	}		
	/**
	 * 修改一个产品，可以修改主图，不能修改子图片，taobao method: taobao.product.update
	 * @param TaobaoProductUpdateParam $param   修改产品参数
	 * @return TaobaoProduct 返回参数， 包括product_id；created：创建日期 ，格式：yyyy-MM-dd HH:mm:ss
	 */ 
	function writeProductUpdate(TaobaoProductUpdateParam $param){
		if(! $param || ! $param->product_id )
		  throw  new TaoBaoRuntimeExecption(-1,'writeProductUpdate运行失败：参数错误');
		$paramarr=get_object_vars($param);
		unset($paramarr['image']);		  
	    if($param->image && file_exists($param->image)){
  		  $request=clone $this->request;
		  $request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		  $request->postWithFiles['image']=$param->image;
		  $resultarr=&$this->__fireRequest('taobao.product.update',$paramarr,false,$request);
		  $request=NULL;
	    }else
	      $resultarr=&$this->__fireRequest('taobao.product.update',$paramarr);
		$result=new TaobaoProduct();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 上传单张产品非主图，如果需要传多张，可调多次，taobao method: taobao.product.img.upload
	 * @param integer $product_id   产品ID,必须
	 * @param string $image   图片路径,必须,图片最大为500K,只支持JPG,GIF格式.
	 * @param integer $id   产品图片ID.修改图片时需要传入
	 * @param integer $position  图片序号
	 * @param integer $is_major  是否将该图片设为主图.可选值:true,false;默认值:false.
	 * @return TaobaoProductImg 返回参数， 包括url,id,created,modified
	 */ 
	function writeProductImgUpload($product_id,$image,$id=NULL,$position=NULL,$is_major=false){
		if(! $product_id )
		  throw  new TaoBaoRuntimeExecption(-1,'writeProductImgUpload运行失败：参数错误');
	    if(!$image || !file_exists($image))
	      throw  new TaoBaoRuntimeExecption(-1,'writeProductImgUpload运行失败：找不到图片');
		$paramarr=array('product_id'=>$product_id,'id'=>$id,'position'=>$position,'is_major'=>$is_major);
		$request=clone $this->request;
		$request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['image']=$image;
		$resultarr=&$this->__fireRequest('taobao.product.img.upload',$paramarr,false,$request);
		$request=NULL;
		$result=new TaobaoProductImg();
		return $this->__firefillProperty($result,$resultarr);
	}
	/**
	 *  删除产品非主图，taobao method: taobao.product.img.delete
	 * @param integer $product_id   产品ID
	 * @param integer $id           产品图片ID.
	 * @return TaobaoProductImg     返回参数， 包括id,product_id
	 */ 
	function writeProductImgDelete($product_id,$id){
		if(! $product_id ||!$id )
		  throw  new TaoBaoRuntimeExecption(-1,'writeProductImgDelete运行失败：参数错误');
		$paramarr=array('product_id'=>$product_id,'id'=>$id);
		$resultarr=&$this->__fireRequest('taobao.product.img.delete',$paramarr);
		$result=new TaobaoProductImg();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 上传单张产品属性图片，如果需要传多张，可调多次，taobao method: taobao.product.propimg.upload
	 * @param integer $product_id   产品ID.Product的id
	 * @param string $props   属性串.目前仅支持颜色属性.
	 * 调用taobao.itemprops.get获取类目属性,取得颜色属性pid,
	 * 再用taobao.itempropvalues.get取得vid;格式:pid:vid,只能传入一个颜色pid:vid串;
	 * @param string $image   图片路径,图片最大为2M,只支持JPG,GIF格式.
	 * @param integer $id     产品属性图片ID.修改图片时需要传入
	 * @param integer $position  图片序号
	 * @return TaobaoProductPropImg 返回参数， 包括url,id,created,modified
	 */ 
	function writeProductPropimgUpload($product_id,$props,$image,$id=NULL,$position=NULL){
		if(! $product_id || !$props )
		  throw  new TaoBaoRuntimeExecption(-1,'writeProductImgUpload运行失败：参数错误');
	    if(!$image || !file_exists($image))
	      throw  new TaoBaoRuntimeExecption(-1,'writeProductImgUpload运行失败：找不到图片');
		$paramarr=array('product_id'=>$product_id,'id'=>$id,'position'=>$position,'props'=>$props);
        $request=clone $this->request;
		$request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['image']=$image;
		$resultarr=&$this->__fireRequest('taobao.product.propimg.upload',$paramarr,false,$request);
		$request=NULL;
		$result=new TaobaoProductPropImg();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 删除产品属性图，taobao method: taobao.product.propimg.delete
	 * @param integer $product_id       产品ID.Product的id.
	 * @param integer $id               属性图片ID.
	 * @return TaobaoProductPropImg     返回参数， 包括id,product_id
	 */ 
	function writeProductPropimgDelete($product_id,$id){
		if(! $product_id ||!$id )
		  throw  new TaoBaoRuntimeExecption(-1,'writeProductPropimgDelete运行失败：参数错误');
		$paramarr=array('product_id'=>$product_id,'id'=>$id);
		$resultarr=&$this->__fireRequest('taobao.product.propimg.delete',$paramarr);
		$result=new TaobaoProductPropImg();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 获取标准类目属性值，taobao method: taobao.itempropvalues.get
	 * <br/>传入类目ID,必需是叶子类目，通过taobao.itemcats.get获取类目ID  
	 * <br/>pvs和datetime二者必需传一个
	 * <br/>返回字段目前支持有：cid,pid,prop_name,vid,name,name_alias,status,sort_order 
	 * <br/>作用:获取标准类目属性值
	 * @param array $result   要填充属性值列表，类型@see PropValue，根据fields传入的参数返回相应的结果
	 * @param integer $cid    叶子类目ID ,通过taobao.itemcats.get获得叶子类目ID 
	 * @param string  $pvs    属性和属性值 id串，格式例如(pid1;pid2)
	 * 或(pid1:vid1;pid2:vid2)或(pid1;pid2:vid2),pvs和datetime二者必需传一个
	 * @param string  $datetime 增量时间戳。格式:yyyy-MM-dd HH:mm:ss,pvs和datetime二者必需传一个
	 * 假如传2005-01-01 00:00:00，则取所有的属性和子属性(状态为删除的属性值不返回prop_name)
	 * @param string  $last_modified 接口返回结果中的最近修改时间。格式:yyyy-MM-dd HH:mm:ss     
	 * @param string $fields  需返回的字段列表。可选值：PropValue结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充属性值列表，类型@see PropValue
	 */ 
	function &readItemPropValues(array &$result,$cid ,$pvs,$datetime='1970-01-01 00:00:00',&$last_modified=NULL,$fields=NULL){
		if(! $cid || (!$pvs && ! $datetime))
		  throw  new TaoBaoRuntimeExecption(-1,'readItemPropValues运行失败：参数错误');
	
		$paramarr=array('cid'=>$cid,'pvs'=>$pvs,'datetime'=>$datetime);
		if(! $fields) $fields=&$this->_getFields(new PropValue());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.itempropvalues.get',$paramarr);
		$list=new ItemProp();
		$this->__firefillProperty($list,$resultarr,ItemProp::$_DataLayerout['varclass']);
		$result=$list->prop_values;
		if(property_exists($list,'last_modified'))
		   $last_modified=$list->last_modified;
		else
		   $last_modified=NULL;		
		return $result;
	}	
	/**
	 * 查询B商家被授权品牌列表和类目列表，taobao method: taobao.itemcats.authorize.get
	 * @param SellerAuthorize $result   要填充授权对象，类型@see SellerAuthorize
	 * @param string $fields  需返回的字段列表。目前支持有：brand.vid, brand.name,
	 * item_cat.cid, item_cat.name, item_cat.status,item_cat.sort_order,
	 * item_cat.parent_cid,item_cat.is_parent <br/>如果为空，自动返回所有字段
	 * @return SellerAuthorize 已经填充授权对象
	 */ 
	function readItemcatsAuthorize(SellerAuthorize $result,$fields=NULL){
		if(! $result)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemcatsAuthorize运行失败：参数错误');
	
		$paramarr=array();
		$paramarr['fields']='brand.vid, brand.name,item_cat.cid,item_cat.name,
		item_cat.status,item_cat.sort_order,item_cat.parent_cid,item_cat.is_parent';
		
		$resultarr = &$this->__fireRequest('taobao.itemcats.authorize.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,
		   SellerAuthorize::$_DataLayerout['varclass']);
	}		
	/**
	 * 获取后台供卖家发布商品的标准商品类目，taobao method: taobao.itemcats.get
	 * <br/>如何获得叶子类目的cid?调用taobao.itemcats.get获取类目ID,
	 * 或通过属性工具(http: //open.taobao.com/api_tool/props/)获得。  
	 * @param array $result   要填充类目列表，类型@see ItemCat
	 * @param integer $parent_cid   父商品类目 id，0表示根节点, 传输该参数返回所有子类目。
	 *  (cids、parent_cid至少传一个) 
	 * @param string $cids    商品所属类目ID列表，用半角逗号(,)分隔
	 *  例如:(18957,19562,) (cids、parent_cid至少传一个)
	 * @param string  $datetime 时间戳。格式:yyyy-MM-dd HH:mm:ss
     * 如果没有传，则取所有的类目信息(如果传了parent_cid或者cids，则忽略datetime),
     * 目前只支持1970-01-01 00:00:00这个值传入
     * @param string  $last_modified 接口返回结果中的最近修改时间。格式:yyyy-MM-dd HH:mm:ss 
	 * @param string $fields  需要返回的字段列表，见ItemCat，默认返回：cid,parent_cid,name,is_parent 
	 * <br/>如果为空，自动返回所有字段
	 * @return array 已经填充类目列表，类型@see ItemCat
	 */ 
	function &readItemcats(array &$result,$parent_cid,$cids,$datetime='1970-01-01 00:00:00',&$last_modified=NULL,$fields=NULL){
		if(! isset($result) || (! $cids && ! isset($parent_cid)))
		  throw  new TaoBaoRuntimeExecption(-1,'readItemcats运行失败：参数错误');
	
		$paramarr=array('parent_cid'=>$parent_cid,'cids'=>$cids,'datetime'=>$datetime);
		if(! $fields) $fields=&$this->_getFields(new ItemCat());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.itemcats.get',$paramarr);
		$list=new SellerAuthorize();
		$this->__firefillProperty($list,$resultarr,SellerAuthorize::$_DataLayerout['varclass']);
		$result=$list->item_cats;
		if(property_exists($list,'last_modified'))
		   $last_modified=$list->last_modified;
		else
		   $last_modified=NULL;  
		return $result;
	}	
	/**
	 * 获取标准商品类目属性，taobao method: taobao.itemprops.get
	 * @param array $result   要填充类目属性信息列表，类型@see ItemProp，
	 * 如果是取全量或者增量，不包括属性值，根据fields传入的参数返回相应的结果
	 * @param ItemPropParam $param 获取标准商品类目属性参数    
	 * @param string  $last_modified 接口返回结果中的最近修改时间
	 * 《(只有取全量或增量的时候会返回该字段)。格式:yyyy-MM-dd HH:mm:ss     
	 * @param string $fields  需返回的字段列表。可选值：PropValue结构体中的所有字段；
	 * 字段之间用“,”分隔。 <br/>如果为空，自动返回所有字段
	 * @return array 已经填充属性值列表，类型@see PropValue
	 */ 
	function &readItemProps(array &$result,ItemPropParam $param,&$last_modified=NULL,$fields=NULL){
		if(! $param || !$param->cid)
		  throw  new TaoBaoRuntimeExecption(-1,'readItemProps运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields){
			$fields=&$this->_getFields(new ItemProp());
		}
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.itemprops.get',$paramarr);
		$list=new _ItemPropList();
		$this->__firefillProperty($list,$resultarr,_ItemPropList::$_DataLayerout['varclass']);
		$result=$list->item_props;
		$last_modified=$list->last_modified;
		return $result;
	}	
	/**
	 * 搜索评价信息，taobao method: taobao.traderates.get
	 * @param TaobaoTradeRatesGetResult $result   要填充搜索评价列表
	 * @param TaobaoTradeRatesGetParam $param     搜索评价参数
	 * @param string $fields  需返回的字段列表。可选值：TradeRate结构体中的所有字段；
	 * 字段之间用","分隔。 <br/>如果为空，自动返回所有字段
	 * @return TaobaoTradeRatesGetResult 已经填充搜索评价列表
	 */ 
	function readTraderates(TaobaoTradeRatesGetResult $result,TaobaoTradeRatesGetParam $param,$fields=NULL){
		if(! $param || !$param->rate_type || !$param->role)
		  throw  new TaoBaoRuntimeExecption(-1,'readTraderates运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields)	$fields=&$this->_getFields(new TaobaoTradeRate());
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.traderates.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoTradeRatesGetResult::$_DataLayerout['varclass']);
	}	
	/**
	 * 新增单个评价，taobao method: taobao.traderate.add 
	 * @param TaobaoTradeRateAddParam $param  新增评价参数.
	 * @return TaobaoTradeRate                返回参数， 包括tid、oid、created
	 */ 
	function writeTraderateAdd(TaobaoTradeRateAddParam $param){
		if(! $param ||!$param->tid ||!$param->result ||!$param->role )
		  throw  new TaoBaoRuntimeExecption(-1,'writeTraderateAdd运行失败：参数错误');
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('taobao.traderate.add',$paramarr);
		$result=new TaobaoTradeRate();
		return $this->__firefillProperty($result,$resultarr);
	}        
	/**
	 * 针对父子订单新增新增批量评价，taobao method: taobao.traderate.list.add 
	 * @param TaobaoTradeRateListAddParam $param  新增评价参数.
	 * @return TaobaoTradeRate                返回参数， 包括tid、created
	 */ 
	function writeTraderateListAdd(TaobaoTradeRateListAddParam $param){
		if(! $param ||!$param->tid ||!$param->result ||!$param->role )
		  throw  new TaoBaoRuntimeExecption(-1,'writeTraderateListAdd运行失败：参数错误');
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('taobao.traderate.list.add',$paramarr);
		$result=new TaobaoTradeRate();
		return $this->__firefillProperty($result,$resultarr);
	} 	
	/**
	 * 获取图片分类信息 ，taobao method: taobao.picture.category.get
	 * @param array $result   要填充图片分类信息列表，类型@see TaobaoPictureCategory
	 * @param integer $picture_category_id 图片分类ID
	 * @param string $picture_category_name 图片分类名，不支持模糊查询
	 * @param string $type 分类类型,
	 * fixed代表店铺装修分类类别，auction代表宝贝分类类别，user-define代表用户自定义分类类别
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoPictureCategory的所有字段
	 * @return array 已经填充的图片分类信息列表，返回的包含的具体信息为入参fields请求的字段信息，类型@see TaobaoPictureCategory
	 */
	function &readPictureCategory(array &$result,$picture_category_id=NULL,$picture_category_name=NULL,$type=NULL,$fields=NULL){
		if(! isset($result))
		  throw  new TaoBaoRuntimeExecption(-1,'readPictureCategory运行失败：参数错误');
		
		$paramarr=array('picture_category_id'=>$picture_category_id,
		  'picture_category_name'=>$picture_category_name,'type'=>$type);
		if(! $fields) $fields=&$this->_getFields(new TaobaoPictureCategory());
		$paramarr['fields']=$fields;  
		$resultarr = &$this->__fireRequest('taobao.picture.category.get',$paramarr);
		$list=new _TaobaoPictureCategoryList(); //* taobao doc error
		$this->__firefillProperty($list,$resultarr,_TaobaoPictureCategoryList::$_DataLayerout['varclass']);
		$result=$list->picture_categories;
		return $result;		  
	}
	/**
	 * 获取图片信息，taobao method: taobao.picture.get 
	 * @param TaobaoPictureResult $result   要填充图片信息列表
	 * @param TaobaoPictureParam $param     获取图片信息参数
	 * @param string $fields  需返回的字段列表。可选值：TaobaoPicture结构体中的所有字段；
	 * 字段之间用","分隔。 <br/>如果为空，自动返回所有字段
	 * @return TaobaoPictureResult 已经填充图片信息列表
	 */ 
	function readPicture(TaobaoPictureResult $result,TaobaoPictureParam $param,$fields=NULL){
		if(! $param || ! isset($result))
		  throw  new TaoBaoRuntimeExecption(-1,'readPicture运行失败：参数错误');
	
		$paramarr=get_object_vars($param);
		if(! $fields)	$fields=&$this->_getFields(new TaobaoPicture());
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.picture.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoPictureResult::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取前台展示的店铺内卖家自定义商品类目 ，taobao method: taobao.sellercats.list.get
	 * @param array $result   要填充店铺内卖家自定义商品类目，类型@see TaobaoSellerCat
	 * @param string $nick    卖家昵称
	 * @return array 已经填充的店铺内卖家自定义商品类目，类型@see TaobaoSellerCat
	 */
	function &readSellercatsList(array &$result,$nick){
		if(! isset($result) || !$nick)
		  throw  new TaoBaoRuntimeExecption(-1,'readShopcatsList运行失败：参数错误');
		
		$paramarr=array('nick'=>$nick);
		$resultarr = &$this->__fireRequest('taobao.sellercats.list.get',$paramarr);
		$list=new _TaobaoSellerCatList();
		$this->__firefillProperty($list,$resultarr,_TaobaoSellerCatList::$_DataLayerout['varclass']);
		$result=$list->seller_cats;
		return $result;		  
	}	
	/**
	 * 获取卖家店铺的基本信息 ，taobao method: taobao.shop.get
	 * @param TaobaoShop $result  要填充卖家店铺信息，类型@see TaobaoShop
	 * @param string $nick   卖家昵称
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoShop的所有字段
	 * @return TaobaoShop 已经填充的卖家店铺信息，返回的包含的具体信息为入参fields请求的字段信息，类型@see TaobaoShop
	 */
	function readShop(TaobaoShop $result,$nick,$fields=NULL){
		if(! isset($result) || !$nick )
		  throw  new TaoBaoRuntimeExecption(-1,'readShop运行失败：参数错误');
		
		$paramarr=array('nick'=>$nick);
		if(! $fields) $fields=&$this->_getFields($result);
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.shop.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoShop::$_DataLayerout['varclass']);
	}
	/**
	 * 获取卖家店铺剩余橱窗数量 ，taobao method: taobao.shop.remainshowcase.get
	 * <br/>B商家不能返回剩余橱窗数量
	 * @param TaobaoShop $result  要填充卖家剩余橱窗数量
	 * @return TaobaoShop 只支持返回剩余橱窗数量
	 */
	function readShopRemainshowcase(TaobaoShop $result){
		if(! isset($result) )
		  throw  new TaoBaoRuntimeExecption(-1,'readShopRemainshowcase运行失败：参数错误');
		$paramarr=array();
		$resultarr = &$this->__fireRequest('taobao.shop.remainshowcase.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoShop::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取前台展示的店铺类目 ，taobao method: taobao.shopcats.list.get
	 * @param array $result   要填充物流公司信息，类型@see TaobaoShopCat
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoShopCat的所有字段
	 * @return array 已经填充的物流公司信息，返回的包含的具体信息为入参fields请求的字段信息，类型@see TaobaoShopCat
	 */
	function &readShopcatsList(array &$result,$fields=NULL){
		if(! isset($result))
		  throw  new TaoBaoRuntimeExecption(-1,'readShopcatsList运行失败：参数错误');
		
		$paramarr=array();
		if(! $fields) $fields=&$this->_getFields(new TaobaoShopCat());
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.shopcats.list.get',$paramarr);
		$list=new _TaobaoShopCatList();
		$this->__firefillProperty($list,$resultarr,_TaobaoShopCatList::$_DataLayerout['varclass']);
		$result=$list->shop_cats;
		return $result;		  
	}
	/**
	 * 上传单张图片，taobao method: taobao.picture.upload
	 * @param string $picture_category_id 图片分类ID，具体某个分类ID或0上传到未分类下，只能一个分类
	 * @param string $image_input_title 包括后缀名的图片标题,不能为空，
	 * 如Bule.jpg,有些卖家希望图片上传后取图片文件的默认名
	 * @param string $image  图片二进制文件名称,必须存在,允许png、jpg、gif图片格式
	 * @param string $title  图片标题,如果为空,传的图片标题就取去掉后缀名的image_input_title,
	 * 超过50字符长度会截取50字符,重名会在标题末尾加"(1)";标题末尾已经有"(数字)"了，则数字加1
	 * @return TaobaoPicture 当前上传的一张图片信息
	 */ 
	function writePictureUpload($picture_category_id,$image_input_title,$image,$title=NULL){
		if(! $picture_category_id || !$image_input_title || !$image )
		  throw  new TaoBaoRuntimeExecption(-1,'writePictureUpload运行失败：参数错误');
	    if(! file_exists($image))
	      throw  new TaoBaoRuntimeExecption(-1,'writePictureUpload运行失败：找不到图像文件  ' . $image);
		$paramarr=array('picture_category_id'=>$picture_category_id,
		     'image_input_title'=>$image_input_title,'title'=>$title);
		$request=clone $this->request;
		$request->httpmethod=TaoBaoRequest::HTTPMETHOD_POSTWITHFILE;
		$request->postWithFiles['img']=$image;
		$resultarr=&$this->__fireRequest('taobao.picture.upload',$paramarr,false,$request); 
		$request=NULL;
		$result=new TaobaoPicture();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 删除图片空间图片，taobao method: taobao.picture.delete
	 * @param string $picture_ids        图片ID字符串,可以一个也可以一组,用英文逗号间隔,如450,120,155
	 * @return boolean 是否删除
	 */ 
	function writePictureDelete($picture_ids){
		if(! $picture_ids )
		  throw  new TaoBaoRuntimeExecption(-1,'writePictureDelete运行失败：参数错误');
	 
		$paramarr=array('picture_ids'=>$picture_ids);
		$resultarr = &$this->__fireRequest('taobao.picture.delete',$paramarr);//*taobao none test sandbox
		$result=new stdClass();
		$this->__firefillProperty($result,$resultarr);
		return $result->success;
	}				
	/**
	 * 更新卖家自定义类目，taobao method: taobao.sellercats.list.update 
	 * @param TaobaoSellerCatAddParam $param  添加卖家自定义类目参数
	 * @return TaobaoSellerCat       返回参数， 包括cid,created
	 */ 
	function writeSellercatsListUpdate(TaobaoSellerCatUpdateParam $param){
		if(!$param || !$param->name)
		  throw  new TaoBaoRuntimeExecption(-1,'writeSellercatsListUpdate运行失败：参数错误');
		if($param->pic_url)	$param->pict_url= $param->pic_url; //taobao ?? pict_url<->pic_url		  
		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('taobao.sellercats.list.update',$paramarr);
		$result=new TaobaoSellerCat();
		return $this->__firefillProperty($result,$resultarr);
	} 	
	/**
	 * 添加卖家自定义类目，taobao method: taobao.sellercats.list.add 
	 * @param TaobaoSellerCatAddParam $param  添加卖家自定义类目参数
	 * @return TaobaoSellerCat       返回参数， 包括cid,created
	 */ 
	function writeSellercatsListAdd(TaobaoSellerCatAddParam $param){
		if(!$param || !$param->name)
		  throw  new TaoBaoRuntimeExecption(-1,'writeSellercatsListAdd运行失败：参数错误');
		if($param->pic_url)	$param->pict_url= $param->pic_url; //taobao ?? pict_url<->pic_url

		$paramarr=get_object_vars($param);
		$resultarr=&$this->__fireRequest('taobao.sellercats.list.add',$paramarr);
		$result=new TaobaoSellerCat();
		return $this->__firefillProperty($result,$resultarr);
	} 	
	/**
	 * 更新店铺基本信息，taobao method: taobao.shop.update 
	 * <br/>更新店铺基本信息，目前只支持标题、分告和描述，title, bulletin和desc至少必须传一个
	 * @param string $title  店铺标题。不超过30个字符；过滤敏感词，如淘咖啡、阿里巴巴等。
	 * @param string $bulletin  店铺公告。不超过1024个字符
	 * @param string $desc      店铺描述。10～2000个字符以内
	 * @return TaobaoShop       返回参数， 包括sid、modified
	 */ 
	function writeShopUpdate($title,$bulletin,$desc){
		if(!$title && !$bulletin && !$desc )
		  throw  new TaoBaoRuntimeExecption(-1,'writeShopUpdate运行失败：参数错误');
		$paramarr=array('title'=>$title,'bulletin'=>$bulletin,'desc'=>$desc);
		$resultarr=&$this->__fireRequest('taobao.shop.update',$paramarr);
		$result=new TaobaoShop();
		return $this->__firefillProperty($result,$resultarr);
	} 
	/**
	 * 获取交易和评价变更通知信息 ，taobao method: taobao.increment.trades.get
	 * @param TaobaoIncrementNotifyTradeResult $result  要填充交易和评价变更通知信息
	 * @param TaobaoIncrementTradesParam $param   接口参数
	 * @return TaobaoIncrementNotifyTradeResult 已经填充的交易和评价变更通知信息
	 */ 
	function readIncrementTrades(TaobaoIncrementNotifyTradeResult $result,TaobaoIncrementTradesParam $param,$fields=NULL){
		if(!$result || !$param )
		  throw  new TaoBaoRuntimeExecption(-1,'readIncrementTrades运行失败：参数错误');
		
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.increment.trades.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoIncrementNotifyTradeResult::$_DataLayerout['varclass']);
	}
	/**
	 * 获取退款变更通知信息 ，taobao method: taobao.increment.refunds.get
	 * @param TaobaoIncrementNotifyRefundResult $result  要填充退款变更通知信息
	 * @param TaobaoIncrementRefundsParam $param   接口参数
	 * @return TaobaoIncrementNotifyRefundResult 已经填充的退款变更通知信息
	 */ 
	function readIncrementRefunds(TaobaoIncrementNotifyRefundResult $result,TaobaoIncrementRefundsParam $param,$fields=NULL){
		if(!$result || !$param )
		  throw  new TaoBaoRuntimeExecption(-1,'readIncrementRefunds运行失败：参数错误');
		
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.increment.refunds.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoIncrementNotifyRefundResult::$_DataLayerout['varclass']);
	}	
	/**
	 * 获取商品变更通知信息 ，taobao method: taobao.increment.items.get
	 * @param TaobaoIncrementNotifyItemResult $result  要填充商品变更通知信息
	 * @param TaobaoIncrementItemsParam $param   接口参数
	 * @return TaobaoIncrementNotifyItemResult 已经填充的商品变更通知信息
	 */ 
	function readIncrementItems(TaobaoIncrementNotifyItemResult $result,TaobaoIncrementItemsParam $param,$fields=NULL){
		if(!$result || !$param )
		  throw  new TaoBaoRuntimeExecption(-1,'readIncrementItems运行失败：参数错误');
		
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.increment.items.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoIncrementNotifyItemResult::$_DataLayerout['varclass']);
	}			
	/**
	 * ISV订阅信息查询 ，taobao method: taobao.increment.subscribemessage.get
	 * @param TaobaoSubscribeMessage $result  要填充ISV订阅信息查询
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoSubscribeMessage的所有字段
	 * @return TaobaoSubscribeMessage 已经填充的ISV订阅信息查询
	 */ 
	function readIncrementSubscribemessage(TaobaoSubscribeMessage $result,$fields=NULL){
		if(!$result )
		  throw  new TaoBaoRuntimeExecption(-1,'readIncrementSubscribemessage运行失败：参数错误');
		$paramarr=array();
		if(! $fields){
			$fields=&$this->_getFields($result);
			$fields .= ',subscriptions.topic,subscriptions.status';
		} 
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.increment.subscribemessage.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoSubscribeMessage::$_DataLayerout['varclass']);
	}	
	/**
	 * 用户授权信息查询 ，taobao method: taobao.increment.authorizemessages.get
	 * @param TaobaoIncrementAuthorizemessagesResult $result  要填充用户授权信息查询
	 * @param TaobaoIncrementAuthorizemessagesParam $param   接口参数
	 * @param string $fields 查询字段。如果为空，自动传入TaobaoAuthorizeMessage的所有字段
	 * @return TaobaoIncrementAuthorizemessagesResult 已经填充的用户授权信息查询
	 */ 
	function readIncrementAuthorizemessages(TaobaoIncrementAuthorizemessagesResult $result,TaobaoIncrementAuthorizemessagesParam $param,$fields=NULL){
		if(!$result )
		  throw  new TaoBaoRuntimeExecption(-1,'readIncrementAuthorizemessages运行失败：参数错误');
		$paramarr=get_object_vars($param);
		if(! $fields) $fields=&$this->_getFields(new TaobaoAuthorizeMessage());
		$paramarr['fields']=$fields;
		$resultarr = &$this->__fireRequest('taobao.increment.authorizemessages.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoIncrementAuthorizemessagesResult::$_DataLayerout['varclass']);
	}		
	/**
	 * ISV订阅增量消息，taobao method: taobao.increment.app.subscribe 
	 * @param string $topics    要订阅的消息类别。可多个类别同时订阅，每种类型之间以";"分隔。具体选值请见：增量消息类型说明。
	 * 例如，如果要同时订阅交易，退款，商品的消息传入的字符串就是"trade;refund;item"
	 * @param string $status    要订阅的消息状态。可选值有：商品消息状态、退款消息状态、交易消息状态里面的状态类型。
	 * status字段支持多个状态同时订阅。每个大类的状态（商品消息状态里的所有消息状态属于同一个大类，
	 * 退款消息状态里的所有消息状态属于同一个大类，交易消息状态里的所有消息状态属于同一个大类）要合并到一起传入。
	 * 每个大类的消息内部用","连接，大类之间用";"连接。另，大类的排列顺序要和topics入参中类型的顺序一一对应，
	 * 如果不传具体某个大类的消息而传入all，表示订阅这个大类下所有的消息状态。如：传入了topics="trade;refund;item"时：当传入status="all; 
	 * all;all"表示我订阅者三种类型消息下的所有状态的消息；当传入status="TradeCreate,TradeSuccess;all; 
	 * ItemDelete"表示我订阅交易类型下的交易创建和交易成功的消息，退款类型下的所有退款相关消息，商品下的商品删除的消息。
	 * @param integer $duration ISV订阅服务时间，以月计算。目前可选值：1、3、6、12四种时间间隔。
	 * 如果ISV属于淘宝的合作伙伴或者是自用型，可以选择订阅时间为-1（表示永久订阅）
	 * <br/>自用型应用：执行taobao.increment.app.subscribe进行订阅，设置duration参数值为-1。自用型应用订阅后默认会自动进行一次授权，授权时间是永远有效。
	 * <br/>他用型应用：首先，执行taobao.increment.app.subscribe进行订阅，设置合理的duration参数（如果为淘宝合作伙伴应用可以设置为-1）； 然后执行taobao.increment.user.authorize进行用户授权。 
	 * <br/>授权后，应用即可通过taobao.increment.items.get、taobao.increment.trades.get或taobao.increment.refunds.get获取已授权用户的增量数据。 
	 * @return TaobaoSubscribeMessage   返回订阅增量消息
	 */ 
	function writeIncrementAppSubscribe($topics,$status,$duration=-1){
		if(!$topics && !$status && !$duration )
		  throw  new TaoBaoRuntimeExecption(-1,'writeIncrementAppSubscribe运行失败：参数错误');
		$paramarr=array('topics'=>$topics,'status'=>$status,'duration'=>$duration);
		$resultarr=&$this->__fireRequest('taobao.increment.app.subscribe',$paramarr);
		$result=new TaobaoSubscribeMessage();
		return $this->__firefillProperty($result,$resultarr);
	} 	
	/**
	 * 用户授权ISV获取其增量消息，taobao method: taobao.increment.user.authorize 
	 * <br/>此接口用于用户授权ISV获取其增量消息。 用户授权后订阅的消息类型继承与ISV订阅的所有消息类型。 
	 * 如果用户已经授权该ISV获取自己的增量消息，重复授权会跟据传入的参数更新授权记录
	 * （如：用户的email信息、有效期限等等） 用户授权的到期时间必须小于等于ISV服务到期时间。 
	 * <br/>自用型应用不需要调用此接口，调用taobao.notify.app.subscribe的时候会默认进行授权。
	 * @param string $email    授权用户的邮件地址
	 * @param string $duration 用户授权的时间，以周计算。
	 * <br/>可选值为1和2，不传默认授权时间为1周。用户授权到期时间不能超过ISV服务到期时间。否则授权会报错。
	 * @return TaobaoAuthorizeMessage   返回用户授权ISV订阅增量消息
	 */  
	function writeIncrementUserAuthorize($email,$duration=1){
		if(!$email  && !$duration )
		  throw  new TaoBaoRuntimeExecption(-1,'writeIncrementUserAuthorize运行失败：参数错误');
		$paramarr=array('email'=>$email,'duration'=>$duration);
		$resultarr=&$this->__fireRequest('taobao.increment.user.authorize',$paramarr);
		$result=new TaobaoAuthorizeMessage();
		return $this->__firefillProperty($result,$resultarr);
	}	
	/**
	 * 读取单个用户信息，taobao method: taobao.user.get
	 * <br/>传入淘宝会员帐号获取用户详细信息，用户登陆才能获取隐私信息，
	 * 但不包括:location.address,real_name,id_card,phone,mobile,email 
	 * <br/>$nick和$alipay_no必须传入一个，或者$user中有对应的值
	 * @param User $user 要填充的用户信息
	 * @param string $nick 用户昵称，如果昵称为中文，请使用UTF-8字符集对昵称进行URL编码
	 * @param string $alipay_no 支付宝账号，用支付宝账号查询用户对象只能查询公开信息。
	 * @param string $fields 查询字段。如果为空，自动传入User的所有字段
	 * <br/>可选值：User结构体中的所有字段；以半角逗号(,)分隔。* 不支持：location.address,real_name,id_card,phone,mobile,email
	 * @return User 返回已经填充的用户信息
	 */
	function readUser(User $user,$nick=NULL,$alipay_no=NULL,$fields=NULL) {
		if(! $user || (! $user->nick && ! $nick && ! $alipay_no && ! $user->alipay_no))
		  throw  new TaoBaoRuntimeExecption(-1,'readUser运行失败：参数错误');
		if(! $user && $user->nick && ! $nick ) $nick=$user->nick;
		if(! $user && $user->alipay_no && ! $alipay_no) $alipay_no=$user->alipay_no;
		 
		$paramarr=array('nick'=> $nick,'alipay_no'=>$alipay_no);
		if(! $fields) $fields=&$this->_getFields($user);
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.user.get',$paramarr);
		return $this->__firefillProperty($user,$resultarr,User::$_DataLayerout['varclass']);
	}
	/**
	 * 读取多个用户信息，taobao method: taobao.users.get
	 * <br/>传入多个淘宝会员帐号返回多个用户公开信息，只能返回公开信息
	 * @param array $user 要填充的用户信息列表，类型：@see User
	 * @param string $nicks 用户昵称，多个以半角逗号(,)分隔，最多40个，如果为中文，请使用UTF-8字符集对昵称进行URL编码
	 * @param string $fields 查询字段。如果为空，自动传入User的所有字段
	 * <br/>可选值：User结构体中的所有字段；以半角逗号(,)分隔。 
	 * @return array 返回已经填充的多个用户信息
	 */
	function &readUsers(array &$users,$nicks,$fields=NULL) {
		if(! $nicks )
		  throw  new TaoBaoRuntimeExecption(-1,'readUsers运行失败：参数错误');
	
		$paramarr=array('nicks'=> $nicks);
		if(! $fields) $fields=&$this->_getFields(new User());
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.users.get',$paramarr);
		$userlist=new _UserList();
		$this->__firefillProperty($userlist,$resultarr,_UserList::$_DataLayerout['varclass']);
		$users=$userlist->users;
		return $users;
	}	
	/**
	 * 获取淘宝系统当前时间，taobao method: taobao.time.get
	 * @param $result 淘宝系统当前时间，格式:yyyy-MM-dd HH:mm:ss
	 * @return User 返回淘宝系统当前时间，格式:yyyy-MM-dd HH:mm:ss
	 */
	function &readTime(&$result=NULL) {
		$resultarr = &$this->__fireRequest('taobao.time.get',array());
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
		$result=$list->time;
		return $result;
	}	
	/**
	 * TP订购生成子KEY，taobao method: taobao.tp.appkey.apply 
	 * <br/>记录TP应用和使用者之间的订购关系，并且为使用者提供自用型的子key。 
	 * @param string $nick              购买TP应用的淘宝用户会员名
	 * @param string $title             需要创建的子应用的应用名称
	 * @param string $order_start_time  服务开始时间，大于结束时间，格式:yyyy-MM-dd HH:mm:ss
	 * @param string $order_end_time    服务结束时间，大于结束时间，格式:yyyy-MM-dd HH:mm:ss
	 * @param string $out_trade_no      TP和用户签署的订单号
	 * @param string $call_back_url     创建的子应用的回调地址
	 * @param string $notify_url        通知URL 
	 * @return array   返回结果。
	 * <br/> 返回结果：subsc_link:订购确认链接； child_app_key:应用子KEY； child_app_secret:子应用的secret。
	 * <br/>错误码说明：isv.invalid-paramete:nick-not-exist:淘宝用户昵称不存在，应 输入在淘宝注册成功的昵称名。
	 * <br/>isv.invalid-paramete:time-error 订购时间无效 ，应  输入正确起始，结束时间。 
	 * <br/>isv.invalid-paramete:not-tp 非TP类型应用,不能创建TP订购关系 ，应  订购是tp（淘宝排挡）的应用。 
	 * <br/>isv.invalid-paramete:double_out_order 订单号重复， 外部订单号输入不能和以前存在的已订购的外部订单号重复 。
	 * <br/>isv.invalid-paramete:exist_waitaffirm_order 有待处理或有效订购， 已经存在待确认生效的或者已经生效的订购关系 。
	 * <br/>isv.build_servise_error:build_order_failed 重复创建子应用 。
	 * <br/>isv.invalid-paramete:tp_cannot_buildChild tp应用不能创建子应用 
	 * <br/>isv.invalid-paramete:tp_buildChild_overrun 该tp应用创建子应用超限 
	 */  
	function writeTPAppkeyApply($nick,$title,$order_start_time,$order_end_time,$out_trade_no,$call_back_url=NULL,$notify_url=NULL){//no test
		if(!$nick  && !$title && !$order_start_time && !$order_end_time  && !$out_trade_no)
		  throw  new TaoBaoRuntimeExecption(-1,'writeTPAppkeyApply运行失败：参数错误');
		$paramarr=array('nick'=>$nick,'title'=>$title,'order_start_time'=>$order_start_time,
		'order_end_time'=>$order_end_time,'out_trade_no'=>$out_trade_no,'call_back_url'=>$call_back_url,'notify_url'=>$notify_url);
		$resultarr=&$this->__fireRequest('taobao.tp.appkey.apply',$paramarr,false);
		return $resultarr['tp_appkey_apply_response'];
	}		
	
	//********extend function******//
	
	/**
	 * B商家保证金查询，taobao method: taobao.guarantyfunds.get
	 * @param array $result   要填充B商家保证金列表，类型@see TaobaoGuarantyFund，
	 * @param string  $begin_date 查询保证金操作记录创建时间开始，格式为:yyyy-MM-dd
	 * @param string  $end_date   查询保证金操作记录创建时间结束，格式为:yyyy-MM-dd
	 * @return array 已经填充B商家保证金列表，类型@see TaobaoGuarantyFund
	 */ 
	function &readGuarantyFunds(array &$result,$begin_date,$end_date){
		if(! isset($result) || !$begin_date || !$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readGuarantyFunds运行失败：参数错误');
		$paramarr=array('begin_date'=>$begin_date,'end_date'=>$end_date);
		$resultarr = &$this->__fireRequest('taobao.guarantyfunds.get',$paramarr);
		$list=new _TaobaoGuarantyFundList();
		$this->__firefillProperty($list,$resultarr,_TaobaoGuarantyFundList::$_DataLayerout['varclass']);
		$result=$list->guarantyFunds;
		return $result;
	}	
	/**
	 * 查询套餐列表信息，taobao method: taobao.suites.get
	 * @param TaobaoSuitesResult $result   要填充套餐列表
	 * @param string  $service_code 用户订购服务的服务码(申请服务的时候会得到)
	 * @return TaobaoSuitesResult 已经填充套餐列表
	 */ 
	function readSuites(TaobaoSuitesResult $result,$service_code){
		if(! $result || !$service_code)
		  throw  new TaoBaoRuntimeExecption(-1,'readSuites运行失败：参数错误');
		$paramarr=array('service_code'=>$service_code);
		$resultarr = &$this->__fireRequest('taobao.suites.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaoSuitesResult::$_DataLayerout['varclass']);
	}		
	/**
	 * 获取聊天对象列表，查询时间段<=7天,只支持xml返回，taobao method: taobao.wangwang.eservice.chatpeers.get
	 * <br/>taobao charset设置为utf-8
	 * @param TaobaoChatPeerListResult $result   要填充聊天对象列表
	 * @param string  $chat_id   聊天用户ID，淘宝nick ，原为cntaobao+淘宝nick，现为淘宝nick
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date 查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return TaobaoChatPeerListResult 已经填充聊天对象列表
	 */ 
	function readWangwangEserviceChatpeers(TaobaoChatPeerListResult $result,$chat_id,$start_date,$end_date){
		if(! $result || !$chat_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceChatpeers运行失败：参数错误');
		$paramarr=array('chat_id'=>'cntaobao' . $chat_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';		
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.chatpeers.get',$paramarr,true,$newreqest);
		
		$this->__firefillProperty($result,$resultarr,TaobaoChatPeerListResult::$_DataLayerout['varclass']);
		foreach($result->chatpeers as $val)
		  $val->uid=str_replace('cntaobao','',$val->uid);
		return $result;
	}	
	/**
	 * 获取具体的聊天记录，taobao method: taobao.wangwang.eservice.chatlog.get
	 * <br/>taobao charset设置为utf-8
	 * @param TaobaoMsgListResult $result   要填充聊天记录列表
	 * @param string  $chat_id   聊天消息被查询用户，淘宝nick ，原为cntaobao+淘宝nick，现为淘宝nick
	 * @param string  $chat_id   聊天消息相关方，淘宝nick ，原为cntaobao+淘宝nick，现为淘宝nick
	 * @param string  $start_date 聊天消息起始时间，如2010-02-01
	 * @param string  $end_date   聊天消息终止时间，如2010-03-24
	 * @return TaobaoMsgListResult 已经填充聊天记录列表
	 */ 
	function readWangwangEserviceChatlog(TaobaoMsgListResult $result,$from_id,$to_id,$start_date,$end_date){
		if(! $result || !$from_id ||!$to_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceChatlog运行失败：参数错误');
		$paramarr=array('from_id'=>'cntaobao' . $from_id,'to_id'=>'cntaobao' . $to_id,
		         'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.chatlog.get',$paramarr,true,$newreqest);
		
		return $this->__firefillProperty($result,$resultarr,TaobaoMsgListResult::$_DataLayerout['varclass']);
	}

	/**
	 * 获取组成员列表，taobao method: taobao.wangwang.eservice.groupmember.get 
	 * <br/>主帐号查询某个组管理员，返回该组组名、和该组所有组成员ID。 主帐号查询自己，返回所有组的组名和ID。 
	 * 返回的组成员ID可以是多个，用 "," 隔开。 只有主账号才能使用该接口查询。 被查者ID只能传入一个。
	 * @param array $result   要填充的组及其成员列表，类型@see TaobaoGroupMember
	 * @param string  $manager_id   组管理员id 
	 * @return array 已经填充的组及其成员列表，类型@see TaobaoGroupMember
	 */ 
	function readWangwangEserviceGroupmember(array &$result,$manager_id){
		if(! isset($result) || !$manager_id )
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceGroupmember运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			$result=str_replace(array('group_member_list'),array('group_memeber_lists'),$result);
			return str_replace(array('cntaobao','<group_memeber_lists>','GroupMember'),
			array('','<group_memeber_lists  list="true">','group_memeber_list'),$result);			
		}		  
		$paramarr=array('manager_id'=> 'cntaobao' .$manager_id);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.groupmember.get',$paramarr,true,$newreqest,'handleGetResultFunc');
		$list=new TaobaoGroupMemberResult();
		$this->__firefillProperty($list,$resultarr,TaobaoGroupMemberResult::$_DataLayerout['varclass']);
		$result=$list->group_memeber_lists;
		return $result;
	}	
	/* 聊天备注：
	 * <br/>备注：1、如果是操作者ID=被查者ID，返回被查者ID的"聊天记录"。 
	 * <br/>2、如果操作者是组管理员，他可以查询他的组中的所有子帐号的"聊天记录"。 
	 * <br/>3、如果操作者是主账户，他可以查询所有子帐号的"聊天记录"。
	 *  <br/>4、被查者ID可以是多个，用 "," 隔开，id数不能超过30。 
	 * <br/>5、开始时间与结束时间之间的间隔不能超过7天	  
	 * <br/>6、6、不能查询90天以前的数据 	 
	 * <br/>7、不能查询当天的数据
	 */	
	/**
	 * 聊天记录查询，taobao method: taobao.wangwang.eservice.chatrecord.get
	 * <br/>该接口会返回一个聊天记录的下载地址。请于5分钟以后使用该链接下载,该链接有如下限制： 
	 * <br/>1.该链接的有效期为3个小时，逾期作废。 <br/>2.同一链接只能使用一次。 用户点击地址，下载聊天记录压缩包
	 * （压缩包中含有1个文件或多个文件，查询了几个用户的聊天记录，就含有几个文本文件）。 
	 * <br/>备注：见 聊天备注。6、不能查询30天以前的数据
	 * @param string $result   要填充的聊天记录下载地址URL
	 * @param string  $service_staff_id   客服id 
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date   查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return string 聊天记录下载地址URL
	 */ 
	function readWangwangEserviceChatrecord(&$log_file_url,$service_staff_id,$start_date,$end_date){
		if(!$service_staff_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceChatrecord运行失败：参数错误');
		$paramarr=array('service_staff_id'=> 'cntaobao' .$service_staff_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.chatrecord.get',$paramarr,true,$newreqest);
		$log_file_url=$resultarr['log_file_url'];
		return $log_file_url;
	}	
	/**
	 *  平均等待时长，taobao method: taobao.wangwang.eservice.avgwaittime.get  
	 * <br/>根据客服ID和日期，获取该客服"当日接待的所有客户的平均等待时长"。 
	 * <br/>备注：见 聊天备注。
	 * @param string $result   要填充的平均等待时长列表,类型@see TaobaoWaitingTimesOnDay
	 * @param string  $service_staff_id   客服id 
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date   查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return array  返回平均等待时长列表,类型@see TaobaoWaitingTimesOnDay
	 */ 
	function readWangwangEserviceAvgwaittime(array &$result,$service_staff_id,$start_date,$end_date){
		if(! isset($result) || !$service_staff_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceAvgwaittime运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			$result=str_replace(array('WaitingTimesOnDay','waiting_time_by_id'),array('waiting_time_list_on_day','waiting_time_list'),$result);
			return str_replace(array('cntaobao','<waiting_time_lists>','<waiting_time_list_on_days>'),
			array('','<waiting_time_lists  list="true">','<waiting_time_list_on_days list="true">'),$result);			
		}
		$paramarr=array('service_staff_id'=> 'cntaobao' .$service_staff_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.avgwaittime.get',$paramarr,true,$newreqest,'handleGetResultFunc');
	
		$list=new TaobaoWaitingTimesOnDayResult();
		$this->__firefillProperty($list,$resultarr,TaobaoWaitingTimesOnDayResult::$_DataLayerout['varclass']);
		$result=$list->waiting_time_list_on_days;

		return $result;
	}	
	/**
	 *  客服评价统计，taobao method: taobao.wangwang.eservice.evaluation.get   
	 * <br/>根据操作者ID，返回被查者ID指定日期内每个帐号每日的"客服评价统计" 
	 * <br/>备注：见 聊天备注。
	 * @param string $result   要填充的客服评价统计列表
	 * @param string  $service_staff_id   客服id 
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date   查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return  array 客服评价统计列表,类型@see TaobaoStaffEvalStatOnDay
	 */ 
	function readWangwangEserviceEvaluation(array &$result,$service_staff_id,$start_date,$end_date){
		if(! isset($result) || !$service_staff_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceEvaluation运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			$result=str_replace(array('staff_eval_stat_by_id'),array('staff_eval_stat_list'),$result);
			return str_replace(array('cntaobao','<staff_eval_stat_lists>','<staff_eval_stat_on_days>'),
			array('','<staff_eval_stat_lists  list="true">','<staff_eval_stat_on_days list="true">'),$result);			
		}		  
		$paramarr=array('service_staff_id'=> 'cntaobao' .$service_staff_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.evaluation.get',$paramarr,true,$newreqest,'handleGetResultFunc');
		$list=new TaobaStaffEvalStatOnDayResult();
		$this->__firefillProperty($list,$resultarr,TaobaStaffEvalStatOnDayResult::$_DataLayerout['varclass']);
		$result=$list->staff_eval_stat_on_days;
		return $result;
	}
	/**
	 *  客服未回复人数，taobao method: taobao.wangwang.eservice.noreplynum.get   
	 * <br/>根据操作者ID，返回被查者ID指定日期内每个帐号每日的"未回复情况"
	 * <br/>备注：见 聊天备注。
	 * @param string $result   要填充的客服未回复人数列表,类型@see TaobaoNonReplyStatOnDay
	 * @param string  $service_staff_id   客服id 
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date   查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return array 客服未回复人数列表,类型@see TaobaoNonReplyStatOnDay
	 */ 
	function readWangwangEserviceNoreplynum(array &$result,$service_staff_id,$start_date,$end_date){
		if(! isset($result) || !$service_staff_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceNoreplynum运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			$result=str_replace(array('NonReplyStatOnDay','nonreply_stat_by_id'),array('non_reply_stat_on_day','nonreply_stat_list'),$result);
			return str_replace(array('cntaobao','<non_reply_stat_on_days>','<nonreply_stat_lists>'),
			array('','<non_reply_stat_on_days  list="true">','<nonreply_stat_lists list="true">'),$result);			
		}			  
		$paramarr=array('service_staff_id'=> 'cntaobao' .$service_staff_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.noreplynum.get',$paramarr,true,$newreqest,'handleGetResultFunc');
		$list=new TaobaoNonReplyStatOnDayResult();
		$this->__firefillProperty($list,$resultarr,TaobaoNonReplyStatOnDayResult::$_DataLayerout['varclass']);
		$result=$list->non_reply_stat_on_days;
		return $result;
	}
	/**
	 *  日累计在线时长，taobao method: taobao.wangwang.eservice.onlinetime.get    
	 * <br/>根据客服ID和日期，获取该客服"当日在线时长"。 
	 * <br/>备注：见 聊天备注。日累计在线时长定义：当日该用户累计的旺旺在线时长
	 * @param string $result   要填充的日累计在线时长列表,类型@see TaobaoOnlineTimesOnDay
	 * @param string  $service_staff_id   客服id 
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date   查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return array 客服日累计在线时长列表,类型@see TaobaoOnlineTimesOnDay
	 */ 
	function readWangwangEserviceOnlinetime(array &$result,$service_staff_id,$start_date,$end_date){
		if(! isset($result) || !$service_staff_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceOnlinetime运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			$result=str_replace(array('online_time_by_id','online_times_on_day'),array('online_time_list','online_times_list_on_day'),$result);
			return str_replace(array('cntaobao','<online_times_list_on_days>','<online_time_lists>'),
			array('','<online_times_list_on_days  list="true">','<online_time_lists list="true">'),$result);			
		}			  
		$paramarr=array('service_staff_id'=> 'cntaobao' .$service_staff_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.onlinetime.get',$paramarr,true,$newreqest,'handleGetResultFunc');
		$list=new TaobaoOnlineTimesOnDayResult();
		$this->__firefillProperty($list,$resultarr,TaobaoOnlineTimesOnDayResult::$_DataLayerout['varclass']);
		$result=$list->online_times_list_on_days;
		return $result;
	}	
	/**
	 *  客服接待数，taobao method: taobao.wangwang.eservice.receivenum.get      
	 * <br/>根据操作者ID，返回被查者ID指定时间段内每个帐号的"已接待人数"
	 * <br/>备注：见 聊天备注。规则：某客服在1天内和同一个客户交流了多次，已回复人数算1;
	 * "已接待人数"定义：买家、卖家彼此发过至少1条消息 ，不论谁先发都可以
	 * @param string $result   要填充的
	 * @param string  $service_staff_id   客服id 
	 * @param string  $start_date 查询起始日期。如2010-02-01，与当前日期间隔小于3个月。
	 * @param string  $end_date   查询结束日期。如2010-03-24，与起始日期跨度不能超过7天  
	 * @return
	 */ 
	function readWangwangEserviceReceivenum(array &$result,$service_staff_id,$start_date,$end_date){
		if(! isset($result) || !$service_staff_id || !$start_date ||!$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readWangwangEserviceOnlinetime运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			$result=str_replace(array('reply_stat_by_id','reply_stat_on_day'),array('reply_stat_list','reply_stat_list_on_day'),$result);
			return str_replace(array('cntaobao','<reply_stat_list_On_days>','<reply_stat_lists>'),
			array('','<reply_stat_list_on_days  list="true">','<reply_stat_lists list="true">'),$result);			
		}			  
		$paramarr=array('service_staff_id'=> 'cntaobao' .$service_staff_id,'start_date'=>$start_date,'end_date'=>$end_date);
		$newreqest=clone $this->request;
		$newreqest->app_setting['format']='xml';			
		$resultarr = &$this->__fireRequest('taobao.wangwang.eservice.receivenum.get',$paramarr,true,$newreqest,'handleGetResultFunc');
		$list=new TaobaoReplyStatOnDayResult();
		$this->__firefillProperty($list,$resultarr,TaobaoReplyStatOnDayResult::$_DataLayerout['varclass']);
		$result=$list->reply_stat_list_on_days;
		return $result;
	}	
	/**
	 * 淘宝客实时报表查询，taobao method: taobao.taobaoke.interval.report.get
	 * @param TaobaokeReport $result   要填充淘宝客报表，类型@see TaobaokeReport，
	 * @param string  $start_date 查询起始时间，格式为yyyy-MM-dd HH:mm:ss 
	 * @param string  $end_date   查询结束时间，格式为yyyy-MM-dd HH:mm:ss.
	 * @return TaobaokeReport 已经填充淘宝客报表，类型@see TaobaokeReport
	 */ 
	function readTaobaokeIntervalReport(TaobaokeReport $result,$start_date,$end_date){
		if(! $result || !$start_date || !$end_date)
		  throw  new TaoBaoRuntimeExecption(-1,'readTaobaokeIntervalReport运行失败：参数错误');
		$paramarr=array('start_date'=>$start_date,'end_date'=>$end_date);
		$resultarr = &$this->__fireRequest('taobao.taobaoke.interval.report.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaokeReport::$_DataLayerout['varclass']);
	}
	/**
	 * 淘宝客报表查询，taobao method: taobao.taobaoke.report.get
	 * @param TaobaokeReport $result   要填充淘宝客报表，类型@see TaobaokeReport，
	 * @param string  $date 需要查询报表的日期，有效的日期为最近3个月内的某一天，格式为:yyyyMMdd,如20090520.  
	 * @param string $fields  需返回的字段列表。可选值：PropValue结构体中的所有字段；
	 * @return TaobaokeReport 已经填充淘宝客报表，类型@see TaobaokeReport
	 */ 
	function readTaobaokeReport(TaobaokeReport $result,$date,$fields=NULL){
		if(! $result || !$date )
		  throw  new TaoBaoRuntimeExecption(-1,'readTaobaokeReport运行失败：参数错误');
		$paramarr=array('date'=>$date);
		if(! $fields) $fields=&$this->_getFields(new TaobaokeReportMember());
		$paramarr['fields']=$fields;		
		$resultarr = &$this->__fireRequest('taobao.taobaoke.report.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,TaobaokeReport::$_DataLayerout['varclass']);
	}

	/**
	 * 采购单发货，taobao method: taobao.fenxiao.delivery.send
	 * @param integer $order_id   采购单编号，必须
	 * @param string $out_sid   运单号，必须
	 * @param string $company_code   物流公司代码，必须
	 * <br/>可选值：EMS(EMS)、STO(申通E物流)、YTO(圆通速递)、ZTO(中通速递)、
	 * ZJS(宅急送)、YUNDA(韵达快运)、 TTKDEX(天天快递)、FEDEX(联邦快递)、
	 * DBL(德邦物流)、HTKY(汇通快运)、HQ(华强物流)、SF(顺丰速运)、
	 * POST(邮政平邮)、OTHER(其他)，<br/>默认为OTHER。
	 * @param string $company_name   物流公司名称，
	 * <br/>公司代码为OTHER时必须填写公司名称，公司代码为其它时该字段忽略，
	 * 取系统中定义的公司代码对应的公司名称。
	 * @return string 更新时间，时间格式：yyyy-MM-dd HH:mm:ss
	 */ 
	function writeFenxiaoDeliverySend($order_id,$out_sid,$company_name,$company_code='OTHER'){
		if(! $order_id  || !$company_code || !$out_sid)
		  throw  new TaoBaoRuntimeExecption(-1,'writeFenxiaoDeliverySend运行失败：参数错误');
		if($company_code=='OTHER'  && !$company_name )
		  throw  new TaoBaoRuntimeExecption(-1,'writeFenxiaoDeliverySend运行失败：必须传入物流公司名称');
		  
		$paramarr=array('order_id'=>$order_id,'company_code'=>$company_code,
		                'out_sid'=>$out_sid);
		if($company_name) $paramarr['company_name']=$company_name;
		$resultarr = &$this->__fireRequest('taobao.fenxiao.delivery.send',$paramarr);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(! property_exists($list,'order_id') || $list->order_id!=$order_id)
		   throw new TaoBaoRuntimeExecption(-2,'writeFenxiaoDeliverySend运行失败：淘宝系统错误');	
        if(property_exists($list,'modified'))
		   return $list->modified;
	}	 
	/**   
	 * 查询采购单信息，taobao method: taobao.fenxiao.orders.get
	 * @param FenxiaoPurchaseOrderList $result   要填充淘宝分销采购单列表
	 * @param FenxiaoPurchaseOrderParam $param 查询分销采购单参数 
	 * @return array 已经填充淘宝采购单列表
	 */ 
	function readFenxiaoOrders(FenxiaoPurchaseOrderList $result,FenxiaoPurchaseOrderParam $param){
		if(! $param || !$param->status ) //||! $param->start_created || !$param->end_created
		  throw  new TaoBaoRuntimeExecption(-1,'readFenxiaoOrders运行失败：参数错误');
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.fenxiao.orders.get',$paramarr);
		return $this->__firefillProperty($result,$resultarr,FenxiaoPurchaseOrderList::$_DataLayerout['varclass']);
	}		
	/**   
	 * 查询分销产品列表，taobao method: taobao.fenxiao.products.get
	 * @param FenxiaoProductList $result   要填充淘宝分销产品列表
	 * @param FenxiaoProductParam $param 查询分销产品列表参数 
	 * @param string $fields  指定查询额外的信息，可选值：skus（sku数据）、images（多图），
	 * 多个可选值用逗号分割。  <br/>如果为空，设置为skus,images
	 * @return FenxiaoProductList 已经填充淘宝分销产品列表
	 */ 
	function readFenxiaoProducts(FenxiaoProductList $result,FenxiaoProductParam $param,$fields=NULL){
		if(! $param )
		  throw  new TaoBaoRuntimeExecption(-1,'readFenxiaoProducts运行失败：参数错误');
		function handleGetResultFunc($result){ //not normal taobao result
			return str_replace(array('fenxiao_product','fenxiao_sku'),array('product','sku'),$result);
		}		
		$paramarr=get_object_vars($param); 
		if(! $fields) $fields='skus,images';
		$paramarr['fields']=$fields;
		
		$resultarr = &$this->__fireRequest('taobao.fenxiao.products.get',$paramarr,true,null,'handleGetResultFunc');
		return $this->__firefillProperty($result,$resultarr,FenxiaoProductList::$_DataLayerout['varclass']);
	}		
	/**   
	 * 添加分销产品，taobao method: taobao.fenxiao.product.add
	 * @param FenxiaoProductAddParam $param 添加分销产品参数 
	 * <br/>必须参数项：name,productcat_id,standard_price,cost_price,retail_price_low
	 * retail_price_high,category_id,quantity,alarm_number,desc,prov,city,
	 * postage_type,have_invoice,have_guarantee
	 * @return array 已经添加分销产品，
	 * 包括pid：产品ID；created：产品创建时间，格式：yyyy-MM-dd HH:mm:ss
	 */  
	function writeFenxiaoProductAdd(FenxiaoProductAddParam $param){
		if(! $param) 
		  throw  new TaoBaoRuntimeExecption(-1,'writeFenxiaoProductAdd运行失败：参数错误');
		  
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.fenxiao.product.add',$paramarr,false);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(! property_exists($list,'pid') || ! property_exists($list,'created'))
		   throw new TaoBaoRuntimeExecption(-2,'writeFenxiaoProductAdd运行失败：淘宝系统错误');	
        return get_object_vars($list);
	}
	/**   
	 * 更新分销产品，taobao method: taobao.fenxiao.product.update
	 * @param FenxiaoProductAddParam $param 更新分销产品参数 
	 * <br/>必须参数项：pid
	 * @return array 已经更新分销产品，
	 * 包括pid：产品ID；modified：产品更新时间，格式：yyyy-MM-dd HH:mm:ss
	 */   
	function writeFenxiaoProductUpdate(FenxiaoProductUpdateParam $param){
		if(! $param)
		  throw  new TaoBaoRuntimeExecption(-1,'writeFenxiaoProductUpdate运行失败：参数错误');
		  
		$paramarr=get_object_vars($param);
		$resultarr = &$this->__fireRequest('taobao.fenxiao.product.update',$paramarr,false);
		$list=new stdClass();
		$this->__firefillProperty($list,$resultarr);
        if(! property_exists($list,'pid') || ! property_exists($list,'modified'))
		   throw new TaoBaoRuntimeExecption(-2,'writeFenxiaoProductUpdate运行失败：淘宝系统错误');	
        return get_object_vars($list);      
	}  
	/**   
	 * 查询产品线列表，taobao method: taobao.fenxiao.productcats.get
	 * @param array $result   要填充淘宝分销产品线列表，类型@see ProductCat
	 * @return array 已经填充淘宝分销产品线列表，类型@see ProductCat
	 */ 
	function &readFenxiaoProductCats(array &$result){
		$paramarr=array();
		$resultarr = &$this->__fireRequest('taobao.fenxiao.productcats.get',$paramarr);
		$list=new _ProductCatList();
		$this->__firefillProperty($list,$resultarr,_ProductCatList::$_DataLayerout['varclass']);
		$result=$list->productcats;
		return $result;
	}		
	/**
	 * 获取淘宝用户信息，taobao method: taobao.fenxiao.tbuser.get
	 * @param array $result   要填充淘宝用户信息列表，类型@see TbUser
	 * @param integer $user_id 获取标准商品类目属性参数    
	 * @return array 已经填充淘宝用户信息列表，类型@see TbUser
	 */ 
	function &readFenxiaoTbUser(array &$result,$user_id){
		if(! $user_id)
		  throw  new TaoBaoRuntimeExecption(-1,'readFenxiaoTbUser运行失败：参数错误');
	
		$paramarr=array('user_id'=>$user_id);
		$resultarr = &$this->__fireRequest('taobao.fenxiao.tbuser.get',$paramarr);
		$list=new _TbUserList();
		$this->__firefillProperty($list,$resultarr,_TbUserList::$_DataLayerout['varclass']);
		$result=$list->tbusers;
		if(count($result)==0){ //for bug ,not array
			$list=new TbUser();
			$this->__firefillProperty($list,$resultarr);
			$result[]=$list;
		} 
		return $result;
	}	
	/**
	 * 查询淘宝仓储平台提供的所有外部仓库，taobao method: taobao.warehouse.extstores.get 
	 * @param array $result   要填充所有外部仓库列表，类型@see TaobaoExStore
	 * @return array 已经填充所有外部仓库列表，类型@see TaobaoExStore
	 */ 
	function &readWarehouseExtstores(array &$result){
		if(! isset($result))
		  throw  new TaoBaoRuntimeExecption(-1,'readWarehouseExtstores运行失败：参数错误');
	
		$paramarr=array();
		$resultarr = &$this->__fireRequest('taobao.warehouse.extstores.get',$paramarr);
		$list=new TaobaoExStoreList();
		$this->__firefillProperty($list,$resultarr,TaobaoExStoreList::$_DataLayerout['varclass']);
		$result=$list->ext_store_list;
		return $result;
	}		
	/**
	 * 查询仓储卖家的自定义仓库，taobao method: taobao.warehouse.sellerstores.get 
	 * @param array $result   要填充自定义仓库列表，类型@see TaobaoSellerStore
	 * @param string $status 自定义仓库状态，如果不传，则返回所有，如WAIT，默认为NULL。
	 * @return array 已经填充自定义仓库列表，类型@see TaobaoSellerStore
	 */ 
	function &readWarehouseSellerstores(array &$result,$status=NULL){
		if(! isset($result))
		  throw  new TaoBaoRuntimeExecption(-1,'readWarehouseSellerstores运行失败：参数错误');
	   
		$paramarr=array('status'=>$status);
		$resultarr = &$this->__fireRequest('taobao.warehouse.sellerstores.get',$paramarr);
		$list=new TaobaoSellerStoreList();
		$this->__firefillProperty($list,$resultarr,TaobaoSellerStoreList::$_DataLayerout['varclass']);
		$result=$list->seller_store_list;
		return $result;
	}	
	
	
	//----private function ------//
	private function &_getFields($obj){
		$result='';
		foreach(get_object_vars($obj) as $key=>$val){
		  if($result) $result .=',';
		  $result .=$key;
		}
		return $result;
	}
	/*  @deprecated REMOVE THE FUNCTION 
	private function __setSimpleProperty(ReflectionClass $refclass,$obj,$varname,$varvalue){
	    if($refclass->hasProperty($varname)){
		  $prop = $refclass->getProperty ( $varname);
		  $prop->setValue ( $obj, $varvalue );
		}		
	}
	*/
	private function __fillProperty($refclass,$obj,array &$arr,$complexClass=NULL){
		foreach ( $arr as $key => $val ) {
			if(! $key) continue;
			if ($refclass->hasProperty ( $key )) {
				$prop = $refclass->getProperty ( $key );
				if(! is_array($val)){ //simple property
				   if($prop->isPrivate() || $prop->isProtected()){
                       $prop->setAccessible(true);
                    }					
				    $prop->setValue ( $obj, $val );
				}
				elseif(count($val)>0){
				   $propvalue=$prop->getValue($obj);
				   if(is_array($propvalue)){
				   	  if(count($val)==1){  //parent has  child,omit
				   	  	list($childkey,$childval)=each($val);
				   	  	if($childkey.'s'==$key) $val=&$childval; 
				   	  	else{
				   	  	  $firstlen=strlen($childkey)-1;
                          if( substr($childkey,0,$firstlen)==substr($key,0,$firstlen) )
			                 $val=&$childval;  	
				   	  	}			   	  	
				   	  }
				   	  $classname=$complexClass[$key];
				   	  if(! $classname || !is_array($val)) //
				   	     $prop->setValue($obj,$val);   //simple set array
				   	  else{
				   	   	  $comprefclass = new ReflectionClass($classname);
				   	   	  $valarr=array();
				   	   	  foreach($val as $valitem){
				   	   	    $compobj=$comprefclass->newInstance();
				   	   	    $this->__fillProperty($comprefclass,$compobj,$valitem,$complexClass);
				   	   	    //$this->__setSimpleProperty($comprefclass,$compobj,'__owner',$obj);
				   	   	    $valarr[]=$compobj;
				   	   	  }
				   	   	  $prop->setValue($obj,$valarr); //set obj array
				   	   }
				   }else{
				   	  $classname=$complexClass[$key];
				   	  if($classname || ($propvalue && is_object($propvalue))){
				   	  	$compobj=NULL;
				   	  	if($propvalue){
				   	  	  $classname=get_class($propvalue);
				   	  	  $compobj=$propvalue;
				   	  	}
				   	    $comprefclass = new ReflectionClass($classname);
				   	    if(! $compobj) $compobj=$comprefclass->newInstance();
			            $this->__fillProperty($comprefclass,$compobj,$val,$complexClass);
			            //$this->__setSimpleProperty($comprefclass,$compobj,'__owner',$obj);
			            $prop->setValue($obj,$compobj); //set obj
				   	  }else{
				   	    if($prop->isPrivate() || $prop->isProtected()){
                          $prop->setAccessible(true);
                        }				   	  	
				   	  	$prop->setValue($obj,$val);   //simple set array
				   	  }
				   }
				}
			}else{  //not found this property,add property
				$obj->$key=$val;
			}
		}
		return $obj;		
	} 

	private function __firefillProperty($obj,array &$arr,$complexClass=NULL){
		if(! $obj || !$arr || count($arr)==0 ) return $obj;
		reset($arr);
		list(,$realarr)=each($arr);
		if(count($realarr)==1){
			list($realkey,$realarray)=each($realarr);
			if(! is_array($realarray)){  //not normal
				$obj->$realkey=$realarray;
				return $obj;
			}
			list($realchildkey,)=each($realarray);
			$firstlen=strlen($realchildkey)-1;
			if(count($realarray)==1 && ($realchildkey.'s'==$realkey || 
			  substr($realchildkey,0,$firstlen)==substr($realkey,0,$firstlen) ) )
			   unset($realarray);
			else  $realarr=&$realarray; 
			reset($realarr);
		}
		if(count($realarr)==0)  return $obj;
				   	  			
		version_compare(PHP_VERSION,'5.3.0')<0;
		$refclass = new ReflectionObject ($obj);
		$this->__fillProperty($refclass,$obj,$realarr,$complexClass);
		//$this->__setSimpleProperty($refclass,$obj,'__runtime',$this);
		return $obj;
	}	
	private function &__fireRequest($cmdid,array $paramArr,$retry=true,TaoBaoRequest $tmprequset=NULL,$handleGetResultFunc=NULL){
		if($tmprequset) $request=$tmprequset;
		else  $request=$this->request;		
		$tryCount=$this->maxTryCount;
		$errcode=0;$errmsg="";
		if ($retry) { //仅可对可 重调用数据不变接口函数 使用
			do {
				try {
					$arr = &$request->getArray ( $cmdid, $paramArr,$handleGetResultFunc );
					if (! $arr || ! $request->checkResult ( $arr, $errcode, $errmsg ))
						$tryCount --;
					else {
						$tryCount = - 1;
						break;
					}
				} catch ( Exception $e ) {
					$tryCount --;
				}
				if ($tryCount < $this->maxTryCount) {
					$ms = rand ( $this->minTrySpanMicroseconds, $this->maxTrySpanMicroseconds );
					usleep ( $ms );
				}
			} while ( $tryCount > 1 && $tryCount < $this->maxTryCount );
		}//仅可对可 重调用数据不变接口函数 使用
		
		if ($tryCount!=-1 || !$retry) {
			try {
				$arr = &$request->getArray ( $cmdid, $paramArr ,$handleGetResultFunc);
			} catch ( Exception $e ) {
				throw new TaoBaoRuntimeExecption ( - 2, '系统运行失败:' . $e->getMessage () );
			}
		}
		if(! $arr)
		    throw  new TaoBaoRuntimeExecption(-2,'系统运行失败:接口没有返回值，或接口返回数据格式错误解析失败');
		
		if(! $request->checkResult($arr,$errcode,$errmsg))
		     throw  new TaoBaoRuntimeExecption($errcode,$errmsg.";\n{$cmdid}");
		return $arr;
	}
}
